summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2010-09-30 18:10:44 +0000
committerGreg Clayton <gclayton@apple.com>2010-09-30 18:10:44 +0000
commiteae9cc6dc7043badf6f1ae359cc04b6efde7900c (patch)
tree37c6ae6a29dd3cd59abe26f3de6929b040f2b103
parenta92bf08038f497e94707b0c6bf9461dc5ae9ea63 (diff)
downloadbcm5719-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.cpp55
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachTask.h2
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; }
OpenPOWER on IntegriCloud