|  | #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; | 
|  | } | 
|  |  |