diff options
author | Han Ming Ong <hanming@apple.com> | 2012-11-29 22:14:45 +0000 |
---|---|---|
committer | Han Ming Ong <hanming@apple.com> | 2012-11-29 22:14:45 +0000 |
commit | 929a94f0263d436e92618097eab008e2d535436e (patch) | |
tree | d068b52c316edeed480fd106c51aab0ce82c69b7 /lldb/tools/debugserver/source/MacOSX | |
parent | 913c96da436e6e37bf2fcfad6ddad1918a542dd9 (diff) | |
download | bcm5719-llvm-929a94f0263d436e92618097eab008e2d535436e.tar.gz bcm5719-llvm-929a94f0263d436e92618097eab008e2d535436e.zip |
<rdar://problem/12780259>
Prevent async and sync calls to get profile data from stomping on each other.
At the same time, don't use '$' as end delimiter per chunk of profile data.
llvm-svn: 168948
Diffstat (limited to 'lldb/tools/debugserver/source/MacOSX')
4 files changed, 22 insertions, 24 deletions
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp index 0a3648467d4..f17bf444f7f 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp @@ -1347,7 +1347,7 @@ MachProcess::SignalAsyncProfileData (const char *info) { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (%s) ...", __FUNCTION__, info); PTHREAD_MUTEX_LOCKER (locker, m_profile_data_mutex); - m_profile_data.append(info); + m_profile_data.push_back(info); m_events.SetEvents(eEventProfileDataAvailable); // Wait for the event bit to reset if a reset ACK is requested @@ -1360,19 +1360,22 @@ MachProcess::GetAsyncProfileData (char *buf, size_t buf_size) { DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (&%p[%llu]) ...", __FUNCTION__, buf, (uint64_t)buf_size); PTHREAD_MUTEX_LOCKER (locker, m_profile_data_mutex); - size_t bytes_available = m_profile_data.size(); + if (m_profile_data.empty()) + return 0; + + size_t bytes_available = m_profile_data.front().size(); if (bytes_available > 0) { if (bytes_available > buf_size) { - memcpy(buf, m_profile_data.data(), buf_size); - m_profile_data.erase(0, buf_size); + memcpy(buf, m_profile_data.front().data(), buf_size); + m_profile_data.front().erase(0, buf_size); bytes_available = buf_size; } else { - memcpy(buf, m_profile_data.data(), bytes_available); - m_profile_data.clear(); + memcpy(buf, m_profile_data.front().data(), bytes_available); + m_profile_data.erase(m_profile_data.begin()); } } return bytes_available; @@ -1390,10 +1393,10 @@ MachProcess::ProfileThread(void *arg) nub_state_t state = proc->GetState(); if (state == eStateRunning) { - const char *data = proc->Task().GetProfileDataAsCString(); - if (data) + std::string data = proc->Task().GetProfileData(); + if (!data.empty()) { - proc->SignalAsyncProfileData(data); + proc->SignalAsyncProfileData(data.c_str()); } } else if ((state == eStateUnloaded) || (state == eStateDetached) || (state == eStateUnloaded)) diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.h b/lldb/tools/debugserver/source/MacOSX/MachProcess.h index fabcc468832..478fc99f86f 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.h +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.h @@ -282,7 +282,7 @@ private: uint64_t m_profile_interval_usec; // If enable, the profiling interval in microseconds pthread_t m_profile_thread; // Thread ID for the thread that profiles the inferior PThreadMutex m_profile_data_mutex; // Multithreaded protection for profile info data - std::string m_profile_data; // Profile data, must be protected by m_profile_data_mutex + std::vector<std::string> m_profile_data; // Profile data, must be protected by m_profile_data_mutex DNBThreadResumeActions m_thread_actions; // The thread actions for the current MachProcess::Resume() call MachException::Message::collection diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp index 836cd3ff0e4..39e509171d5 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp @@ -54,7 +54,6 @@ MachTask::MachTask(MachProcess *process) : m_exception_port (MACH_PORT_NULL) { memset(&m_exc_port_info, 0, sizeof(m_exc_port_info)); - } //---------------------------------------------------------------------- @@ -277,19 +276,20 @@ static void update_used_time(task_t task, int &num_threads, uint64_t **threads_i kr = mach_vm_deallocate(mach_task_self(), (mach_vm_address_t)(uintptr_t)threads, tcnt * sizeof(*threads)); } -const char * -MachTask::GetProfileDataAsCString () +std::string +MachTask::GetProfileData () { + std::string result; task_t task = TaskPort(); if (task == TASK_NULL) - return NULL; + return result; struct task_basic_info task_info; DNBError err; err = BasicInfo(task, &task_info); if (!err.Success()) - return NULL; + return result; uint64_t elapsed_usec = 0; uint64_t task_used_usec = 0; @@ -347,19 +347,15 @@ MachTask::GetProfileDataAsCString () profile_data_stream << "vprvt:" << vprvt << ';'; profile_data_stream << "vsize:" << vsize << ';'; profile_data_stream << "dirty:" << dirty_size << ';'; - profile_data_stream << "$"; + profile_data_stream << "end;"; - m_profile_data = profile_data_stream.str(); - } - else - { - m_profile_data.clear(); + result = profile_data_stream.str(); } free(threads_id); free(threads_used_usec); - return m_profile_data.c_str(); + return result; } diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.h b/lldb/tools/debugserver/source/MacOSX/MachTask.h index b289065b512..52169715407 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachTask.h +++ b/lldb/tools/debugserver/source/MacOSX/MachTask.h @@ -66,7 +66,7 @@ public: nub_size_t ReadMemory (nub_addr_t addr, nub_size_t size, void *buf); nub_size_t WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf); int GetMemoryRegionInfo (nub_addr_t addr, DNBRegionInfo *region_info); - const char * GetProfileDataAsCString (); + std::string GetProfileData (); nub_addr_t AllocateMemory (nub_size_t size, uint32_t permissions); nub_bool_t DeallocateMemory (nub_addr_t addr); @@ -123,7 +123,6 @@ protected: typedef std::map <mach_vm_address_t, size_t> allocation_collection; allocation_collection m_allocations; - std::string m_profile_data; private: MachTask(const MachTask&); // Outlaw |