diff options
author | Greg Clayton <gclayton@apple.com> | 2010-09-30 18:10:44 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2010-09-30 18:10:44 +0000 |
commit | eae9cc6dc7043badf6f1ae359cc04b6efde7900c (patch) | |
tree | 37c6ae6a29dd3cd59abe26f3de6929b040f2b103 | |
parent | a92bf08038f497e94707b0c6bf9461dc5ae9ea63 (diff) | |
download | bcm5719-llvm-eae9cc6dc7043badf6f1ae359cc04b6efde7900c.tar.gz bcm5719-llvm-eae9cc6dc7043badf6f1ae359cc04b6efde7900c.zip |
Retry task_for_pid a few times to avoid some cases where task_for_pid fails.
llvm-svn: 115184
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachTask.cpp | 55 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/MacOSX/MachTask.h | 2 |
2 files changed, 34 insertions, 23 deletions
diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp index 9262d6b331c..61ace434ec5 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp @@ -214,29 +214,40 @@ MachTask::TaskPortForProcessID (DNBError &err) // MachTask::TaskPortForProcessID //---------------------------------------------------------------------- task_t -MachTask::TaskPortForProcessID (pid_t pid, DNBError &err) +MachTask::TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries, uint32_t usec_interval) { - task_t task = TASK_NULL; - if (pid != INVALID_NUB_PROCESS) - { - mach_port_t task_self = mach_task_self (); - err = ::task_for_pid ( task_self, pid, &task); - if (DNBLogCheckLogBit(LOG_TASK) || err.Fail()) - { - char str[1024]; - ::snprintf (str, - sizeof(str), - "::task_for_pid ( target_tport = 0x%4.4x, pid = %d, &task ) => err = 0x%8.8x (%s)", - task_self, - pid, - err.Error(), - err.AsString() ? err.AsString() : "success"); - if (err.Fail()) - err.SetErrorString(str); - err.LogThreaded(str); - } - } - return task; + if (pid != INVALID_NUB_PROCESS) + { + DNBError err; + mach_port_t task_self = mach_task_self (); + task_t task = TASK_NULL; + for (uint32_t i=0; i<num_retries; i++) + { + err = ::task_for_pid ( task_self, pid, &task); + + if (DNBLogCheckLogBit(LOG_TASK) || err.Fail()) + { + char str[1024]; + ::snprintf (str, + sizeof(str), + "::task_for_pid ( target_tport = 0x%4.4x, pid = %d, &task ) => err = 0x%8.8x (%s)", + task_self, + pid, + err.Error(), + err.AsString() ? err.AsString() : "success"); + if (err.Fail()) + err.SetErrorString(str); + err.LogThreaded(str); + } + + if (err.Success()) + return task; + + // Sleep a bit and try again + ::usleep (usec_interval); + } + } + return TASK_NULL; } diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.h b/lldb/tools/debugserver/source/MacOSX/MachTask.h index 3bf40e13457..a907e94d344 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachTask.h +++ b/lldb/tools/debugserver/source/MacOSX/MachTask.h @@ -66,7 +66,7 @@ public: static void * ExceptionThread (void *arg); task_t TaskPort () const { return m_task; } task_t TaskPortForProcessID (DNBError &err); - static task_t TaskPortForProcessID (pid_t pid, DNBError &err); + static task_t TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, uint32_t usec_interval = 10000); MachProcess * Process () { return m_process; } const MachProcess * Process () const { return m_process; } |