Skip to content

Commit 2eb6be1

Browse files
committed
Cygwin: revert use of CancelSyncronousIo on wait_thread.
It appears this is causing hangs on native x86_64 in similar scenarios as the hangs on ARM64, because `CancelSynchronousIo` is returning `TRUE` but not canceling the `ReadFile` call as expected. Addresses: msys2/MSYS2-packages#4340 (comment) Fixes: b091b47 ("cygthread: suspend thread before terminating.") Signed-off-by: Jeremy Drake <[email protected]>
1 parent 3cd8609 commit 2eb6be1

File tree

2 files changed

+5
-17
lines changed

2 files changed

+5
-17
lines changed

winsup/cygwin/pinfo.cc

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,17 +1262,13 @@ proc_waiter (void *arg)
12621262

12631263
for (;;)
12641264
{
1265-
DWORD nb, err;
1265+
DWORD nb;
12661266
char buf = '\0';
12671267

12681268
if (!ReadFile (vchild.rd_proc_pipe, &buf, 1, &nb, NULL)
1269-
&& (err = GetLastError ()) != ERROR_BROKEN_PIPE)
1269+
&& GetLastError () != ERROR_BROKEN_PIPE)
12701270
{
1271-
/* ERROR_OPERATION_ABORTED is expected due to the possibility that
1272-
CancelSynchronousIo interruped the ReadFile call, so don't output
1273-
that error */
1274-
if (err != ERROR_OPERATION_ABORTED)
1275-
system_printf ("error on read of child wait pipe %p, %E", vchild.rd_proc_pipe);
1271+
system_printf ("error on read of child wait pipe %p, %E", vchild.rd_proc_pipe);
12761272
break;
12771273
}
12781274

winsup/cygwin/sigproc.cc

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -409,11 +409,7 @@ proc_terminate ()
409409
to 1 iff it is a Cygwin process. */
410410
if (!have_execed || !have_execed_cygwin)
411411
chld_procs[i]->ppid = 1;
412-
/* Attempt to exit the wait_thread cleanly via CancelSynchronousIo
413-
before falling back to the (explicitly dangerous) cross-thread
414-
termination */
415-
if (chld_procs[i].wait_thread
416-
&& !CancelSynchronousIo (chld_procs[i].wait_thread->thread_handle ()))
412+
if (chld_procs[i].wait_thread)
417413
chld_procs[i].wait_thread->terminate_thread ();
418414
/* Release memory associated with this process unless it is 'myself'.
419415
'myself' is only in the chld_procs table when we've execed. We
@@ -1178,11 +1174,7 @@ remove_proc (int ci)
11781174
{
11791175
if (have_execed)
11801176
{
1181-
/* Attempt to exit the wait_thread cleanly via CancelSynchronousIo
1182-
before falling back to the (explicitly dangerous) cross-thread
1183-
termination */
1184-
if (_my_tls._ctinfo != chld_procs[ci].wait_thread
1185-
&& !CancelSynchronousIo (chld_procs[ci].wait_thread->thread_handle ()))
1177+
if (_my_tls._ctinfo != chld_procs[ci].wait_thread)
11861178
chld_procs[ci].wait_thread->terminate_thread ();
11871179
}
11881180
else if (chld_procs[ci] && chld_procs[ci]->exists ())

0 commit comments

Comments
 (0)