summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/Process.cpp
diff options
context:
space:
mode:
authorHan Ming Ong <hanming@apple.com>2012-11-17 00:21:04 +0000
committerHan Ming Ong <hanming@apple.com>2012-11-17 00:21:04 +0000
commitab3b8b22a157f98bab6260ddf2b88b05dcb4cd1e (patch)
tree9232dcea9c6bef57d9d10297647ad9eb322b79af /lldb/source/Target/Process.cpp
parentf1b6177b62567cdda828b2cf25f04b7009274c91 (diff)
downloadbcm5719-llvm-ab3b8b22a157f98bab6260ddf2b88b05dcb4cd1e.tar.gz
bcm5719-llvm-ab3b8b22a157f98bab6260ddf2b88b05dcb4cd1e.zip
<rdar://problem/12720514> Sub-TLF: Provide service to profile the inferior
This allows client to query profiling states on the inferior. llvm-svn: 168228
Diffstat (limited to 'lldb/source/Target/Process.cpp')
-rw-r--r--lldb/source/Target/Process.cpp46
1 files changed, 45 insertions, 1 deletions
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index ee6fd27ae62..6ece3196ca4 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -953,6 +953,8 @@ Process::Process(Target &target, Listener &listener) :
m_stdio_communication_mutex (Mutex::eMutexTypeRecursive),
m_stdout_data (),
m_stderr_data (),
+ m_profile_data_comm_mutex (Mutex::eMutexTypeRecursive),
+ m_profile_data (),
m_memory_cache (*this),
m_allocated_memory_cache (*this),
m_should_detach (false),
@@ -972,6 +974,7 @@ Process::Process(Target &target, Listener &listener) :
SetEventName (eBroadcastBitInterrupt, "interrupt");
SetEventName (eBroadcastBitSTDOUT, "stdout-available");
SetEventName (eBroadcastBitSTDERR, "stderr-available");
+ SetEventName (eBroadcastBitProfileData, "profile-data-available");
m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlStop , "control-stop" );
m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlPause , "control-pause" );
@@ -981,7 +984,8 @@ Process::Process(Target &target, Listener &listener) :
eBroadcastBitStateChanged |
eBroadcastBitInterrupt |
eBroadcastBitSTDOUT |
- eBroadcastBitSTDERR);
+ eBroadcastBitSTDERR |
+ eBroadcastBitProfileData);
m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster,
eBroadcastBitStateChanged |
@@ -2546,6 +2550,12 @@ Process::DeallocateMemory (addr_t ptr)
return error;
}
+//Error
+//Process::GetProfileData (uint64_t &elapsed_usec, uint64_t &task_used_usec, int &num_threads, uint64_t **threads_id, uint64_t **threads_used_usec, mach_vm_size_t &rprvt, mach_vm_size_t &rsize, mach_vm_size_t &vprvt, mach_vm_size_t &vsize, mach_vm_size_t &dirty_size)
+//{
+// return DoGetProfileData(elapsed_usec, task_used_usec, num_threads, threads_id, threads_used_usec, rprvt, rsize, vprvt, vsize, dirty_size);
+//}
+//
ModuleSP
Process::ReadModuleFromMemory (const FileSpec& file_spec,
lldb::addr_t header_addr,
@@ -3999,6 +4009,40 @@ Process::AppendSTDERR (const char * s, size_t len)
BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (shared_from_this(), GetState()));
}
+void
+Process::BroadcastAsyncProfileData(const char *s, size_t len)
+{
+ Mutex::Locker locker (m_profile_data_comm_mutex);
+ m_profile_data.append (s, len);
+ BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState()));
+}
+
+size_t
+Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error)
+{
+ Mutex::Locker locker(m_profile_data_comm_mutex);
+ size_t bytes_available = m_profile_data.size();
+ if (bytes_available > 0)
+ {
+ LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
+ if (log)
+ log->Printf ("Process::GetProfileData (buf = %p, size = %llu)", buf, (uint64_t)buf_size);
+ if (bytes_available > buf_size)
+ {
+ memcpy(buf, m_profile_data.c_str(), buf_size);
+ m_profile_data.erase(0, buf_size);
+ bytes_available = buf_size;
+ }
+ else
+ {
+ memcpy(buf, m_profile_data.c_str(), bytes_available);
+ m_profile_data.clear();
+ }
+ }
+ return bytes_available;
+}
+
+
//------------------------------------------------------------------
// Process STDIO
//------------------------------------------------------------------
OpenPOWER on IntegriCloud