[Lldb-commits] [lldb] r266118 - Revert to using libdispatch to reap threads on MacOSX. Code was accidentally checked in that is now reverted.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 12 13:26:42 PDT 2016
Author: gclayton
Date: Tue Apr 12 15:26:41 2016
New Revision: 266118
URL: http://llvm.org/viewvc/llvm-project?rev=266118&view=rev
Log:
Revert to using libdispatch to reap threads on MacOSX. Code was accidentally checked in that is now reverted.
<rdar://problem/25643874>
Modified:
lldb/trunk/source/Host/macosx/Host.mm
Modified: lldb/trunk/source/Host/macosx/Host.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Host.mm?rev=266118&r1=266117&r2=266118&view=diff
==============================================================================
--- lldb/trunk/source/Host/macosx/Host.mm (original)
+++ lldb/trunk/source/Host/macosx/Host.mm Tue Apr 12 15:26:41 2016
@@ -1448,8 +1448,6 @@ Host::ShellExpandArguments (ProcessLaunc
return error;
}
-#include <thread>
-
HostThread
Host::StartMonitoringChildProcess(Host::MonitorChildProcessCallback callback, void *callback_baton, lldb::pid_t pid, bool monitor_signals)
{
@@ -1460,20 +1458,30 @@ Host::StartMonitoringChildProcess(Host::
Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_HOST | LIBLLDB_LOG_PROCESS));
+ dispatch_source_t source = ::dispatch_source_create (DISPATCH_SOURCE_TYPE_PROC,
+ pid,
+ mask,
+ ::dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT,0));
+
if (log)
- log->Printf ("Host::StartMonitoringChildProcess (callback=%p, baton=%p, pid=%i, monitor_signals=%i)\n",
- callback,
- callback_baton,
- (int)pid,
- monitor_signals);
-
- std::thread GrimReaper([callback, pid, log, callback_baton]() {
- int status= 0;
- int wait_pid = 0;
- bool cancel = false;
- bool exited = false;
- while(!exited)
- {
+ log->Printf ("Host::StartMonitoringChildProcess (callback=%p, baton=%p, pid=%i, monitor_signals=%i) source = %p\n",
+ callback,
+ callback_baton,
+ (int)pid,
+ monitor_signals,
+ source);
+
+ if (source)
+ {
+ ::dispatch_source_set_cancel_handler (source, ^{
+ ::dispatch_release (source);
+ });
+ ::dispatch_source_set_event_handler (source, ^{
+
+ int status= 0;
+ int wait_pid = 0;
+ bool cancel = false;
+ bool exited = false;
do
{
wait_pid = ::waitpid (pid, &status, 0);
@@ -1515,15 +1523,19 @@ Host::StartMonitoringChildProcess(Host::
status_cstr,
signal,
exit_status);
-
+
if (callback)
cancel = callback (callback_baton, pid, exited, signal, exit_status);
+
+ if (exited || cancel)
+ {
+ ::dispatch_source_cancel(source);
+ }
}
- }
- });
-
- GrimReaper.detach();
-
+ });
+
+ ::dispatch_resume (source);
+ }
return HostThread();
}
More information about the lldb-commits
mailing list