Skip to content

Commit 89f3dc9

Browse files
authored
[debugserver] Migrate MachProcess away from PThreadMutex (NFC) (#137553)
The debugserver code predates modern C++, but with C++11 and later there's no need to have something like PThreadMutex. This migrates MachProcess away from PThreadMutex in preparation for removing it.
1 parent 5cfd81b commit 89f3dc9

File tree

2 files changed

+29
-31
lines changed

2 files changed

+29
-31
lines changed

lldb/tools/debugserver/source/MacOSX/MachProcess.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include "MachVMMemory.h"
3535
#include "PThreadCondition.h"
3636
#include "PThreadEvent.h"
37-
#include "PThreadMutex.h"
3837
#include "RNBContext.h"
3938
#include "ThreadInfo.h"
4039

@@ -413,7 +412,7 @@ class MachProcess {
413412
uint32_t m_stop_count; // A count of many times have we stopped
414413
pthread_t m_stdio_thread; // Thread ID for the thread that watches for child
415414
// process stdio
416-
PThreadMutex m_stdio_mutex; // Multithreaded protection for stdio
415+
std::recursive_mutex m_stdio_mutex; // Multithreaded protection for stdio
417416
std::string m_stdout_data;
418417

419418
bool m_profile_enabled; // A flag to indicate if profiling is enabled
@@ -423,7 +422,7 @@ class MachProcess {
423422
m_profile_scan_type; // Indicates what needs to be profiled
424423
pthread_t
425424
m_profile_thread; // Thread ID for the thread that profiles the inferior
426-
PThreadMutex
425+
std::recursive_mutex
427426
m_profile_data_mutex; // Multithreaded protection for profile info data
428427
std::vector<std::string>
429428
m_profile_data; // Profile data, must be protected by m_profile_data_mutex
@@ -435,15 +434,16 @@ class MachProcess {
435434
// caught when
436435
// listening to the
437436
// exception port
438-
PThreadMutex m_exception_and_signal_mutex; // Multithreaded protection for
439-
// exceptions and signals.
437+
std::recursive_mutex
438+
m_exception_and_signal_mutex; // Multithreaded protection for
439+
// exceptions and signals.
440440

441441
MachThreadList m_thread_list; // A list of threads that is maintained/updated
442442
// after each stop
443443
Genealogy m_activities; // A list of activities that is updated after every
444444
// stop lazily
445445
nub_state_t m_state; // The state of our process
446-
PThreadMutex m_state_mutex; // Multithreaded protection for m_state
446+
std::recursive_mutex m_state_mutex; // Multithreaded protection for m_state
447447
PThreadEvent m_events; // Process related events in the child processes
448448
// lifetime can be waited upon
449449
PThreadEvent m_private_events; // Used to coordinate running and stopping the

lldb/tools/debugserver/source/MacOSX/MachProcess.mm

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -522,19 +522,17 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
522522
MachProcess::MachProcess()
523523
: m_pid(0), m_cpu_type(0), m_child_stdin(-1), m_child_stdout(-1),
524524
m_child_stderr(-1), m_path(), m_args(), m_task(this),
525-
m_flags(eMachProcessFlagsNone), m_stdio_thread(0),
526-
m_stdio_mutex(PTHREAD_MUTEX_RECURSIVE), m_stdout_data(),
527-
m_profile_enabled(false), m_profile_interval_usec(0), m_profile_thread(0),
528-
m_profile_data_mutex(PTHREAD_MUTEX_RECURSIVE), m_profile_data(),
525+
m_flags(eMachProcessFlagsNone), m_stdio_thread(0), m_stdio_mutex(),
526+
m_stdout_data(), m_profile_enabled(false), m_profile_interval_usec(0),
527+
m_profile_thread(0), m_profile_data_mutex(), m_profile_data(),
529528
m_profile_events(0, eMachProcessProfileCancel), m_thread_actions(),
530-
m_exception_messages(),
531-
m_exception_and_signal_mutex(PTHREAD_MUTEX_RECURSIVE), m_thread_list(),
532-
m_activities(), m_state(eStateUnloaded),
533-
m_state_mutex(PTHREAD_MUTEX_RECURSIVE), m_events(0, kAllEventsMask),
534-
m_private_events(0, kAllEventsMask), m_breakpoints(), m_watchpoints(),
535-
m_name_to_addr_callback(NULL), m_name_to_addr_baton(NULL),
536-
m_image_infos_callback(NULL), m_image_infos_baton(NULL),
537-
m_sent_interrupt_signo(0), m_auto_resume_signo(0), m_did_exec(false),
529+
m_exception_messages(), m_exception_and_signal_mutex(), m_thread_list(),
530+
m_activities(), m_state(eStateUnloaded), m_state_mutex(),
531+
m_events(0, kAllEventsMask), m_private_events(0, kAllEventsMask),
532+
m_breakpoints(), m_watchpoints(), m_name_to_addr_callback(NULL),
533+
m_name_to_addr_baton(NULL), m_image_infos_callback(NULL),
534+
m_image_infos_baton(NULL), m_sent_interrupt_signo(0),
535+
m_auto_resume_signo(0), m_did_exec(false),
538536
m_dyld_process_info_create(nullptr),
539537
m_dyld_process_info_for_each_image(nullptr),
540538
m_dyld_process_info_release(nullptr),
@@ -577,7 +575,7 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
577575

578576
nub_state_t MachProcess::GetState() {
579577
// If any other threads access this we will need a mutex for it
580-
PTHREAD_MUTEX_LOCKER(locker, m_state_mutex);
578+
std::lock_guard<std::recursive_mutex> guard(m_state_mutex);
581579
return m_state;
582580
}
583581

@@ -1279,7 +1277,7 @@ static bool mach_header_validity_test(uint32_t magic, uint32_t cputype) {
12791277

12801278
// Scope for mutex locker
12811279
{
1282-
PTHREAD_MUTEX_LOCKER(locker, m_state_mutex);
1280+
std::lock_guard<std::recursive_mutex> guard(m_state_mutex);
12831281
const nub_state_t old_state = m_state;
12841282

12851283
if (old_state == eStateExited) {
@@ -1338,7 +1336,7 @@ static bool mach_header_validity_test(uint32_t magic, uint32_t cputype) {
13381336
m_stop_count = 0;
13391337
m_thread_list.Clear();
13401338
{
1341-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
1339+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
13421340
m_exception_messages.clear();
13431341
m_sent_interrupt_signo = 0;
13441342
m_auto_resume_signo = 0;
@@ -1578,7 +1576,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
15781576
bool MachProcess::Interrupt() {
15791577
nub_state_t state = GetState();
15801578
if (IsRunning(state)) {
1581-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
1579+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
15821580
if (m_sent_interrupt_signo == 0) {
15831581
m_sent_interrupt_signo = SIGSTOP;
15841582
if (Signal(m_sent_interrupt_signo)) {
@@ -1736,7 +1734,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
17361734
m_thread_actions.Append(thread_action);
17371735
m_thread_actions.SetDefaultThreadActionIfNeeded(eStateRunning, 0);
17381736

1739-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
1737+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
17401738

17411739
ReplyToAllExceptions();
17421740
}
@@ -1862,7 +1860,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
18621860
}
18631861

18641862
void MachProcess::ReplyToAllExceptions() {
1865-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
1863+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
18661864
if (!m_exception_messages.empty()) {
18671865
MachException::Message::iterator pos;
18681866
MachException::Message::iterator begin = m_exception_messages.begin();
@@ -1896,7 +1894,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
18961894
}
18971895
}
18981896
void MachProcess::PrivateResume() {
1899-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
1897+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
19001898

19011899
m_auto_resume_signo = m_sent_interrupt_signo;
19021900
if (m_auto_resume_signo)
@@ -2298,7 +2296,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
22982296
// data has already been copied.
22992297
void MachProcess::ExceptionMessageReceived(
23002298
const MachException::Message &exceptionMessage) {
2301-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
2299+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
23022300

23032301
if (m_exception_messages.empty())
23042302
m_task.Suspend();
@@ -2312,7 +2310,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
23122310

23132311
task_t MachProcess::ExceptionMessageBundleComplete() {
23142312
// We have a complete bundle of exceptions for our child process.
2315-
PTHREAD_MUTEX_LOCKER(locker, m_exception_and_signal_mutex);
2313+
std::lock_guard<std::recursive_mutex> guard(m_exception_and_signal_mutex);
23162314
DNBLogThreadedIf(LOG_EXCEPTIONS, "%s: %llu exception messages.",
23172315
__PRETTY_FUNCTION__, (uint64_t)m_exception_messages.size());
23182316
bool auto_resume = false;
@@ -2495,7 +2493,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
24952493
void MachProcess::AppendSTDOUT(char *s, size_t len) {
24962494
DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (<%llu> %s) ...", __FUNCTION__,
24972495
(uint64_t)len, s);
2498-
PTHREAD_MUTEX_LOCKER(locker, m_stdio_mutex);
2496+
std::lock_guard<std::recursive_mutex> guard(m_stdio_mutex);
24992497
m_stdout_data.append(s, len);
25002498
m_events.SetEvents(eEventStdioAvailable);
25012499

@@ -2506,7 +2504,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
25062504
size_t MachProcess::GetAvailableSTDOUT(char *buf, size_t buf_size) {
25072505
DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (&%p[%llu]) ...", __FUNCTION__,
25082506
static_cast<void *>(buf), (uint64_t)buf_size);
2509-
PTHREAD_MUTEX_LOCKER(locker, m_stdio_mutex);
2507+
std::lock_guard<std::recursive_mutex> guard(m_stdio_mutex);
25102508
size_t bytes_available = m_stdout_data.size();
25112509
if (bytes_available > 0) {
25122510
if (bytes_available > buf_size) {
@@ -2733,7 +2731,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
27332731

27342732
void MachProcess::SignalAsyncProfileData(const char *info) {
27352733
DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (%s) ...", __FUNCTION__, info);
2736-
PTHREAD_MUTEX_LOCKER(locker, m_profile_data_mutex);
2734+
std::lock_guard<std::recursive_mutex> guard(m_profile_data_mutex);
27372735
m_profile_data.push_back(info);
27382736
m_events.SetEvents(eEventProfileDataAvailable);
27392737

@@ -2744,7 +2742,7 @@ static uint64_t bits(uint64_t value, uint32_t msbit, uint32_t lsbit) {
27442742
size_t MachProcess::GetAsyncProfileData(char *buf, size_t buf_size) {
27452743
DNBLogThreadedIf(LOG_PROCESS, "MachProcess::%s (&%p[%llu]) ...", __FUNCTION__,
27462744
static_cast<void *>(buf), (uint64_t)buf_size);
2747-
PTHREAD_MUTEX_LOCKER(locker, m_profile_data_mutex);
2745+
std::lock_guard<std::recursive_mutex> guard(m_profile_data_mutex);
27482746
if (m_profile_data.empty())
27492747
return 0;
27502748

0 commit comments

Comments
 (0)