[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