1 #include <windows.h>
2 #include <stdio.h>
3 
4 HANDLE waitForCtrlBreakEvent;
5 
CtrlHandler(DWORD fdwCtrlType)6 BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
7 {
8     switch (fdwCtrlType)
9     {
10     case CTRL_BREAK_EVENT:
11         SetEvent(waitForCtrlBreakEvent);
12         return TRUE;
13     default:
14         return FALSE;
15     }
16 }
17 
main(void)18 int main(void)
19 {
20     waitForCtrlBreakEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
21     if (!waitForCtrlBreakEvent) {
22         fprintf(stderr, "ERROR: Could not create event\n");
23         return 1;
24     }
25 
26     if (!SetConsoleCtrlHandler(CtrlHandler, TRUE))
27     {
28         fprintf(stderr, "ERROR: Could not set control handler\n");
29         return 1;
30     }
31 
32     // The library must be loaded after the SetConsoleCtrlHandler call
33     // so that the library handler registers after the main program.
34     // This way the library handler gets called first.
35     HMODULE dummyDll = LoadLibrary("dummy.dll");
36     if (!dummyDll) {
37         fprintf(stderr, "ERROR: Could not load dummy.dll\n");
38         return 1;
39     }
40 
41     // Call the Dummy function so that Go initialization completes, since
42     // all cgo entry points call out to _cgo_wait_runtime_init_done.
43     if (((int(*)(void))GetProcAddress(dummyDll, "Dummy"))() != 42) {
44         fprintf(stderr, "ERROR: Dummy function did not return 42\n");
45         return 1;
46     }
47 
48     printf("ready\n");
49     fflush(stdout);
50 
51     if (WaitForSingleObject(waitForCtrlBreakEvent, 5000) != WAIT_OBJECT_0) {
52         fprintf(stderr, "FAILURE: No signal received\n");
53         return 1;
54     }
55 
56     return 0;
57 }
58