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.
  • Loading branch information
jeremyd2019 committed Nov 12, 2024
1 parent 16dfe94 commit 45a7988
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions winsup/cygwin/cygthread.cc
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,13 @@ cygthread::terminate_thread ()
if (!inuse)
goto force_notterminated;

if (_my_tls._ctinfo != this)
{
CONTEXT context;

This comment has been minimized.

Copy link
@pmsjt

pmsjt Nov 12, 2024

It is advisable to initialize the ContextFlags field, for example:

context.ContextFlags = CONTEXT_CONTROL;

to make sure the API actually does anything as well as make sure it doesn't overwrite the stack should the accidental flag combination be valid and include CONTEXT_XSTATE.

SuspendThread(h);
GetThreadContext(h, &context);
}

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

0 comments on commit 45a7988

Please sign in to comment.