Skip to content

Commit

Permalink
cygthread: suspend thread before terminating.
Browse files Browse the repository at this point in the history
It seems SuspendThread makes sure the thread is "booted" from emulation
before it is suspended.  Hopefully this means it won't be holding any
locks or otherwise leave emulation in a bad state when it's terminated.

Addresses: https://cygwin.com/pipermail/cygwin-developers/2024-May/012694.html
Signed-off-by: Jeremy Drake <cygwin@jdrake.com>
  • Loading branch information
jeremyd2019 committed Nov 12, 2024
1 parent 16dfe94 commit 7863965
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions winsup/cygwin/cygthread.cc
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,20 @@ cygthread::terminate_thread ()
if (!inuse)
goto force_notterminated;

if (_my_tls._ctinfo != this)
{
CONTEXT context;
context.ContextFlags = CONTEXT_CONTROL;
/* SuspendThread makes sure a thread is "booted" from emulation before
it is suspended. As such, the emulator hopefully won't be in a bad
state (aka, holding any locks) when the thread is terminated. */
SuspendThread (h);
/* We need to call GetThreadContext, even though we don't care about the
context, because SuspendThread is asynchronous and GetThreadContext
will make sure the thread is *really* suspended before returning */
GetThreadContext (h, &context);
}

TerminateThread (h, 0);
WaitForSingleObject (h, INFINITE);
CloseHandle (h);
Expand Down

0 comments on commit 7863965

Please sign in to comment.