#define WIN32_LEAN_AND_MEAN #include #include "EXTERN.h" #include "perl.h" #include "XSUB.h" DWORD WINAPI ThreadFunc ( HANDLE * eventPtr) { DWORD retval; retval = WaitForSingleObject(*eventPtr, 10000); if(retval == WAIT_OBJECT_0) { printf("wait suceeded"); } else if(retval == WAIT_TIMEOUT){ //crash gracefully printf("Timeout, now exiting"); exit(1);} } //crash gracefully else {printf("WaitForSingleObject failed"); exit(1);} if(!CloseHandle(*eventPtr) { //crash gracefully printf("CloseHandle failed error is %u\n", GetLastError()); exit(1); } free(eventPtr); return 1; } MODULE = MyMod PACKAGE = MyMod PROTOTYPES: DISABLE DWORD perlfunc () PREINIT: HANDLE * evtHandlePtr; HANDLE thHandle; CODE: evtHandlePtr = malloc(sizeof(HANDLE)); *evtHandlePtr = CreateEvent(NULL, TRUE, FALSE, NULL); if(*evtHandlePtr == NULL){printf("CreateEvent failed error is %u\n",GetLastError()); exit(1);} thHandle = CreateThread(NULL, 1024, ThreadFunc, evtHandlePtr, 0, NULL); if(thHandle == NULL){printf("CreateThread failed error is %u\n",GetLastError()); exit(1);} else { if (!CloseHandle(thHandle)) {printf("CloseHandle on thread handle failed error is %u\n",GetLastError()); exit(1);} } //lets time out, so no SetEvent RETVAL = 1; OUTPUT: RETVAL