diff options
author | Han Ming Ong <hanming@apple.com> | 2012-11-17 00:21:04 +0000 |
---|---|---|
committer | Han Ming Ong <hanming@apple.com> | 2012-11-17 00:21:04 +0000 |
commit | ab3b8b22a157f98bab6260ddf2b88b05dcb4cd1e (patch) | |
tree | 9232dcea9c6bef57d9d10297647ad9eb322b79af /lldb/source/Target/Process.cpp | |
parent | f1b6177b62567cdda828b2cf25f04b7009274c91 (diff) | |
download | bcm5719-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.cpp | 46 |
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 //------------------------------------------------------------------ |