summaryrefslogtreecommitdiffstats
path: root/lldb/tools/debugserver/source/MacOSX
diff options
context:
space:
mode:
authorHan Ming Ong <hanming@apple.com>2012-11-29 22:14:45 +0000
committerHan Ming Ong <hanming@apple.com>2012-11-29 22:14:45 +0000
commit929a94f0263d436e92618097eab008e2d535436e (patch)
treed068b52c316edeed480fd106c51aab0ce82c69b7 /lldb/tools/debugserver/source/MacOSX
parent913c96da436e6e37bf2fcfad6ddad1918a542dd9 (diff)
downloadbcm5719-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')
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachProcess.cpp21
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachProcess.h2
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachTask.cpp20
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachTask.h3
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
OpenPOWER on IntegriCloud