blob: 808da64a03478387380e659aaaa5224638aa468f [file] [log] [blame]
#define _WIN32_WINNT 0x400
#include "test.h"
static int washere = 0;
static void * func(void * arg)
{
washere = 1;
Sleep(1000);
return 0;
}
static void
anotherEnding ()
{
/*
* Switched context
*/
washere++;
pthread_exit(0);
}
int
main()
{
pthread_t t;
HANDLE hThread;
assert(pthread_create(&t, NULL, func, NULL) == 0);
hThread = pthread_gethandle (t);
Sleep(500);
SuspendThread(hThread);
if (WaitForSingleObject(hThread, 0) == WAIT_TIMEOUT)
{
/*
* Ok, thread did not exit before we got to it.
*/
CONTEXT context;
context.ContextFlags = CONTEXT_CONTROL;
GetThreadContext(hThread, &context);
#ifdef _M_X64
context.Rip = (uintptr_t) anotherEnding;
#else
context.Eip = (uintptr_t) anotherEnding;
#endif
SetThreadContext(hThread, &context);
ResumeThread(hThread);
}
else
{
printf("Exited early\n");
fflush(stdout);
}
Sleep(1000);
assert(washere == 2);
return 0;
}