diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 43e003419e..4bb19464b4 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -1268,6 +1268,9 @@ proc_waiter (void *arg) if (!ReadFile (vchild.rd_proc_pipe, &buf, 1, &nb, NULL) && (err = GetLastError ()) != ERROR_BROKEN_PIPE) { + /* ERROR_OPERATION_ABORTED is expected due to the possibility that + CancelSynchronousIo interruped the ReadFile call, so don't output + that error */ if (err != ERROR_OPERATION_ABORTED) system_printf ("error on read of child wait pipe %p, %E", vchild.rd_proc_pipe); break; diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 0089626563..19a2aec334 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -409,9 +409,12 @@ proc_terminate () to 1 iff it is a Cygwin process. */ if (!have_execed || !have_execed_cygwin) chld_procs[i]->ppid = 1; - if (chld_procs[i].wait_thread) - if (!CancelSynchronousIo (chld_procs[i].wait_thread->thread_handle ())) - chld_procs[i].wait_thread->terminate_thread (); + /* Attempt to exit the wait_thread cleanly via CancelSynchronousIo + before falling back to the (explicitly dangerous) cross-thread + termination */ + if (chld_procs[i].wait_thread + && !CancelSynchronousIo (chld_procs[i].wait_thread->thread_handle ())) + chld_procs[i].wait_thread->terminate_thread (); /* Release memory associated with this process unless it is 'myself'. 'myself' is only in the chld_procs table when we've execed. We reach here when the next process has finished initializing but we @@ -1175,7 +1178,11 @@ remove_proc (int ci) { if (have_execed) { - if (_my_tls._ctinfo != chld_procs[ci].wait_thread) + /* Attempt to exit the wait_thread cleanly via CancelSynchronousIo + before falling back to the (explicitly dangerous) cross-thread + termination */ + if (_my_tls._ctinfo != chld_procs[ci].wait_thread + && !CancelSynchronousIo (chld_procs[ci].wait_thread->thread_handle ())) chld_procs[ci].wait_thread->terminate_thread (); } else if (chld_procs[ci] && chld_procs[ci]->exists ())