Delay sync with the parent thread in ProcessLinux/ProcessMonitor.

This patch removes a potential race condition between a process monitor thread
and its parent waiting to interrogate the success/failure of the launch.

llvm-svn: 123803
This commit is contained in:
Stephen Wilson 2011-01-19 01:37:06 +00:00
parent d2d6665c71
commit 570243b5d9
2 changed files with 8 additions and 5 deletions

View File

@ -607,7 +607,7 @@ ProcessMonitor::OperationThread(void *arg)
if (!Launch(args))
return NULL;
ServeOperation(args->m_monitor);
ServeOperation(args);
return NULL;
}
@ -716,8 +716,6 @@ ProcessMonitor::Launch(LaunchArgs *args)
process.SendMessage(ProcessMessage::Trace(pid));
FINISH:
// Sync with our parent thread now that the launch operation is complete.
sem_post(&args->m_semaphore);
return args->m_error.Success();
}
@ -819,15 +817,20 @@ ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor, lldb::pid_t pid)
}
void
ProcessMonitor::ServeOperation(ProcessMonitor *monitor)
ProcessMonitor::ServeOperation(LaunchArgs *args)
{
int status;
pollfd fdset;
ProcessMonitor *monitor = args->m_monitor;
fdset.fd = monitor->m_server_fd;
fdset.events = POLLIN | POLLPRI;
fdset.revents = 0;
// We are finised with the arguments and are ready to go. Sync with the
// parent thread and start serving operations on the inferior.
sem_post(&args->m_semaphore);
for (;;)
{
if ((status = poll(&fdset, 1, -1)) < 0)

View File

@ -197,7 +197,7 @@ private:
EnableIPC();
static void
ServeOperation(ProcessMonitor *monitor);
ServeOperation(LaunchArgs *args);
static bool
DupDescriptor(const char *path, int fd, int flags);