diff options
Diffstat (limited to 'source/API/SBProcess.cpp')
-rw-r--r-- | source/API/SBProcess.cpp | 155 |
1 files changed, 117 insertions, 38 deletions
diff --git a/source/API/SBProcess.cpp b/source/API/SBProcess.cpp index eea5fdca2b38..50211bfde329 100644 --- a/source/API/SBProcess.cpp +++ b/source/API/SBProcess.cpp @@ -23,6 +23,7 @@ #include "lldb/Core/State.h" #include "lldb/Core/Stream.h" #include "lldb/Core/StreamFile.h" +#include "lldb/Target/MemoryRegionInfo.h" #include "lldb/Target/Process.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/SystemRuntime.h" @@ -36,6 +37,8 @@ #include "lldb/API/SBDebugger.h" #include "lldb/API/SBEvent.h" #include "lldb/API/SBFileSpec.h" +#include "lldb/API/SBMemoryRegionInfo.h" +#include "lldb/API/SBMemoryRegionInfoList.h" #include "lldb/API/SBThread.h" #include "lldb/API/SBThreadCollection.h" #include "lldb/API/SBStream.h" @@ -163,7 +166,7 @@ SBProcess::RemoteLaunch (char const **argv, ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); if (process_sp->GetState() == eStateConnected) { if (stop_at_entry) @@ -209,7 +212,7 @@ SBProcess::RemoteAttachToProcessWithID (lldb::pid_t pid, lldb::SBError& error) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); if (process_sp->GetState() == eStateConnected) { ProcessAttachInfo attach_info; @@ -251,7 +254,7 @@ SBProcess::GetNumThreads () Process::StopLocker stop_locker; const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); num_threads = process_sp->GetThreadList().GetSize(can_update); } @@ -272,7 +275,7 @@ SBProcess::GetSelectedThread () const ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); thread_sp = process_sp->GetThreadList().GetSelectedThread(); sb_thread.SetThread (thread_sp); } @@ -295,7 +298,7 @@ SBProcess::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); thread_sp = process_sp->CreateOSPluginThread(tid, context); sb_thread.SetThread (thread_sp); } @@ -465,7 +468,7 @@ SBProcess::SetSelectedThread (const SBThread &thread) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); return process_sp->GetThreadList().SetSelectedThreadByID (thread.GetThreadID()); } return false; @@ -480,7 +483,7 @@ SBProcess::SetSelectedThreadByID (lldb::tid_t tid) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); ret_val = process_sp->GetThreadList().SetSelectedThreadByID (tid); } @@ -501,7 +504,7 @@ SBProcess::SetSelectedThreadByIndexID (uint32_t index_id) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id); } @@ -525,7 +528,7 @@ SBProcess::GetThreadAtIndex (size_t index) { Process::StopLocker stop_locker; const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update); sb_thread.SetThread (thread_sp); } @@ -549,9 +552,11 @@ SBProcess::GetNumQueues () if (process_sp) { Process::StopLocker stop_locker; - - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); - num_queues = process_sp->GetQueueList().GetSize(); + if (stop_locker.TryLock(&process_sp->GetRunLock())) + { + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); + num_queues = process_sp->GetQueueList().GetSize(); + } } if (log) @@ -572,9 +577,12 @@ SBProcess::GetQueueAtIndex (size_t index) if (process_sp) { Process::StopLocker stop_locker; - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); - queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); - sb_queue.SetQueue (queue_sp); + if (stop_locker.TryLock(&process_sp->GetRunLock())) + { + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); + queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index); + sb_queue.SetQueue (queue_sp); + } } if (log) @@ -593,7 +601,7 @@ SBProcess::GetStopID(bool include_expression_stops) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); if (include_expression_stops) return process_sp->GetStopID(); else @@ -612,7 +620,7 @@ SBProcess::GetStopEventForStopID(uint32_t stop_id) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); event_sp = process_sp->GetStopEventForStopID(stop_id); sb_event.reset(event_sp); } @@ -634,7 +642,7 @@ SBProcess::GetState () ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); ret_val = process_sp->GetState(); } @@ -655,7 +663,7 @@ SBProcess::GetExitStatus () ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); exit_status = process_sp->GetExitStatus (); } Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); @@ -674,7 +682,7 @@ SBProcess::GetExitDescription () ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); exit_desc = process_sp->GetExitDescription (); } Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); @@ -760,7 +768,7 @@ SBProcess::Continue () if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); if (process_sp->GetTarget().GetDebugger().GetAsyncExecution ()) sb_error.ref() = process_sp->Resume (); @@ -790,7 +798,7 @@ SBProcess::Destroy () ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError(process_sp->Destroy(false)); } else @@ -817,7 +825,7 @@ SBProcess::Stop () ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError (process_sp->Halt()); } else @@ -843,7 +851,7 @@ SBProcess::Kill () ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError (process_sp->Destroy(true)); } else @@ -877,7 +885,7 @@ SBProcess::Detach (bool keep_stopped) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError (process_sp->Detach(keep_stopped)); } else @@ -893,7 +901,7 @@ SBProcess::Signal (int signo) ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError (process_sp->Signal (signo)); } else @@ -939,7 +947,7 @@ SBProcess::GetThreadByID (tid_t tid) { Process::StopLocker stop_locker; const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); thread_sp = process_sp->GetThreadList().FindThreadByID (tid, can_update); sb_thread.SetThread (thread_sp); } @@ -963,7 +971,7 @@ SBProcess::GetThreadByIndexID (uint32_t index_id) { Process::StopLocker stop_locker; const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock()); - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update); sb_thread.SetThread (thread_sp); } @@ -1080,7 +1088,7 @@ SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); bytes_read = process_sp->ReadMemory (addr, dst, dst_len, sb_error.ref()); } else @@ -1120,7 +1128,7 @@ SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBE Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); bytes_read = process_sp->ReadCStringFromMemory (addr, (char *)buf, size, sb_error.ref()); } else @@ -1149,7 +1157,7 @@ SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBErro Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); value = process_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, sb_error.ref()); } else @@ -1178,7 +1186,7 @@ SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); ptr = process_sp->ReadPointerFromMemory (addr, sb_error.ref()); } else @@ -1218,7 +1226,7 @@ SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &s Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); bytes_written = process_sp->WriteMemory (addr, src, src_len, sb_error.ref()); } else @@ -1282,7 +1290,7 @@ SBProcess::GetNumSupportedHardwareWatchpoints (lldb::SBError &sb_error) const ProcessSP process_sp(GetSP()); if (process_sp) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError(process_sp->GetWatchpointSupportInfo (num)); if (log) log->Printf ("SBProcess(%p)::GetNumSupportedHardwareWatchpoints () => %u", @@ -1312,7 +1320,7 @@ SBProcess::LoadImage (const lldb::SBFileSpec &sb_local_image_spec, Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); return platform_sp->LoadImage (process_sp.get(), *sb_local_image_spec, @@ -1341,7 +1349,7 @@ SBProcess::UnloadImage (uint32_t image_token) Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); PlatformSP platform_sp = process_sp->GetTarget().GetPlatform(); sb_error.SetError (platform_sp->UnloadImage (process_sp.get(), image_token)); } @@ -1369,7 +1377,7 @@ SBProcess::SendEventData (const char *event_data) Process::StopLocker stop_locker; if (stop_locker.TryLock(&process_sp->GetRunLock())) { - Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); sb_error.SetError (process_sp->SendEventData (event_data)); } else @@ -1459,7 +1467,7 @@ SBProcess::SaveCore(const char *file_name) return error; } - Mutex::Locker api_locker(process_sp->GetTarget().GetAPIMutex()); + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); if (process_sp->GetState() != eStateStopped) { @@ -1471,3 +1479,74 @@ SBProcess::SaveCore(const char *file_name) error.ref() = PluginManager::SaveCore(process_sp, core_file); return error; } + +lldb::SBError +SBProcess::GetMemoryRegionInfo (lldb::addr_t load_addr, SBMemoryRegionInfo &sb_region_info) +{ + lldb::SBError sb_error; + ProcessSP process_sp(GetSP()); + MemoryRegionInfoSP region_info_sp = std::make_shared<lldb_private::MemoryRegionInfo>(); + if (process_sp) + { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&process_sp->GetRunLock())) + { + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); + sb_error.ref() = process_sp->GetMemoryRegionInfo(load_addr, *region_info_sp); + if( sb_error.Success() ) { + sb_region_info.ref() = *region_info_sp; + } + } + else + { + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", + static_cast<void*>(process_sp.get())); + sb_error.SetErrorString("process is running"); + } + } + else + { + sb_error.SetErrorString ("SBProcess is invalid"); + } + return sb_error; +} + +lldb::SBMemoryRegionInfoList +SBProcess::GetMemoryRegions() +{ + lldb::SBError sb_error; + lldb::SBMemoryRegionInfoList sb_region_list; + ProcessSP process_sp(GetSP()); + if (process_sp) + { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&process_sp->GetRunLock())) + { + std::lock_guard<std::recursive_mutex> guard(process_sp->GetTarget().GetAPIMutex()); + std::vector<MemoryRegionInfoSP> region_list; + sb_error.ref() = process_sp->GetMemoryRegions(region_list); + if( sb_error.Success() ) { + std::vector<MemoryRegionInfoSP>::iterator end = region_list.end(); + for( std::vector<MemoryRegionInfoSP>::iterator it = region_list.begin(); it != end; it++ ) { + SBMemoryRegionInfo sb_region_info(it->get()); + sb_region_list.Append(sb_region_info); + } + } + } + else + { + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); + if (log) + log->Printf ("SBProcess(%p)::GetMemoryRegionInfo() => error: process is running", + static_cast<void*>(process_sp.get())); + sb_error.SetErrorString("process is running"); + } + } + else + { + sb_error.SetErrorString ("SBProcess is invalid"); + } + return sb_region_list; +} |