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(); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits