]> Cypherpunks repositories - gostls13.git/commitdiff
windows: runtime: implemented console ctrl handler (SIGINT).
authorHector Chu <hectorchu@gmail.com>
Mon, 14 Feb 2011 17:15:13 +0000 (12:15 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 14 Feb 2011 17:15:13 +0000 (12:15 -0500)
R=rsc, brainman, iant2
CC=golang-dev
https://golang.org/cl/4129049

src/pkg/runtime/windows/386/defs.h
src/pkg/runtime/windows/386/signal.c
src/pkg/runtime/windows/386/sys.s
src/pkg/runtime/windows/defs.c
src/pkg/runtime/windows/os.h
src/pkg/runtime/windows/thread.c

index a2a882103462b7cb6d50185e12ce1f2bfaa9504d..49fc19504afe6afb5c67faf7a5d532379f87bc8b 100644 (file)
@@ -10,6 +10,9 @@ enum {
        PROT_EXEC = 0x4,
        MAP_ANON = 0x1,
        MAP_PRIVATE = 0x2,
+       SIGINT = 0x2,
+       CTRL_C_EVENT = 0,
+       CTRL_BREAK_EVENT = 0x1,
        EXCEPTION_ACCESS_VIOLATION = 0xc0000005,
        EXCEPTION_BREAKPOINT = 0x80000003,
        EXCEPTION_FLT_DENORMAL_OPERAND = 0xc000008d,
index 69178cdd08f6e5fb5b1e506a37ddace940a71102..90363691029e9d154f6a1ac164feedd262643be1 100644 (file)
@@ -27,12 +27,7 @@ runtime·dumpregs(Context *r)
 void
 runtime·initsig(int32)
 {
-}
-
-String
-runtime·signame(int32)
-{
-       return runtime·emptystring;
+       runtime·siginit();
 }
 
 uint32
index 26069d3912d83089f400e97515738ee50df0c047..bca48febe72d66f888d48fbccc9e1ecb8d1664e1 100644 (file)
@@ -99,6 +99,45 @@ TEXT runtime·sigtramp1(SB),0,$16-28
 sigdone:
        RET
 
+// Windows runs the ctrl handler in a new thread.
+TEXT runtime·ctrlhandler(SB),7,$0
+       PUSHL   BP
+       MOVL    SP, BP
+       PUSHL   BX
+       PUSHL   SI
+       PUSHL   DI
+       PUSHL   0x2c(FS)
+       MOVL    SP, BX
+
+       // setup dummy m, g
+       SUBL    $(m_sehframe+4), SP     // at least space for m_sehframe
+       LEAL    m_tls(SP), CX
+       MOVL    CX, 0x2c(FS)
+       MOVL    SP, m(CX)
+       MOVL    SP, DX
+       SUBL    $8, SP                  // space for g_stack{guard,base}
+       MOVL    SP, g(CX)
+       MOVL    SP, m_g0(DX)
+       LEAL    -4096(SP), CX
+       MOVL    CX, g_stackguard(SP)
+       MOVL    BX, g_stackbase(SP)
+
+       PUSHL   8(BP)
+       CALL    runtime·ctrlhandler1(SB)
+       POPL    CX
+
+       get_tls(CX)
+       MOVL    g(CX), CX
+       MOVL    g_stackbase(CX), SP
+       POPL    0x2c(FS)
+       POPL    DI
+       POPL    SI
+       POPL    BX
+       POPL    BP
+       MOVL    0(SP), CX
+       ADDL    $8, SP
+       JMP     CX
+
 // Called from dynamic function created by ../thread.c compilecallback,
 // running on Windows stack (not Go stack).
 // BX, BP, SI, DI registers and DF flag are preserved
index 5aac03c81677d8508b022da8130294cdda17d75e..3b2824940f9401bfbe762b379eaac36fca82506d 100644 (file)
@@ -2,9 +2,11 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+#include <signal.h>
 #include <stdarg.h>
 #include <windef.h>
 #include <winbase.h>
+#include <wincon.h>
 
 enum {
        $PROT_NONE = 0,
@@ -15,6 +17,10 @@ enum {
        $MAP_ANON = 1,
        $MAP_PRIVATE = 2,
 
+       $SIGINT = SIGINT,
+       $CTRL_C_EVENT = CTRL_C_EVENT,
+       $CTRL_BREAK_EVENT = CTRL_BREAK_EVENT,
+
        $EXCEPTION_ACCESS_VIOLATION = STATUS_ACCESS_VIOLATION,
        $EXCEPTION_BREAKPOINT = STATUS_BREAKPOINT,
        $EXCEPTION_FLT_DENORMAL_OPERAND = STATUS_FLOAT_DENORMAL_OPERAND,
index 391eace5a05daff7390287dd69793a8b0595b006..77881e86ecb22de77bd3d71f5585a190f3016f9b 100644 (file)
@@ -20,6 +20,7 @@ uint32 runtime·tstart_stdcall(M *newm);
 
 uint32 runtime·issigpanic(uint32);
 void runtime·sigpanic(void);
+uint32 runtime·ctrlhandler(uint32 type);
 
 // Windows dll function to go callback entry.
 byte *runtime·compilecallback(Eface fn, bool cleanstack);
index 278a5da69288a4d2b8554f78a4d99ae61c01e167..525fd0980168dd71388d01aa6338ba534fa749c4 100644 (file)
@@ -18,6 +18,7 @@
 #pragma dynimport runtime·LoadLibraryEx LoadLibraryExA "kernel32.dll"
 #pragma dynimport runtime·QueryPerformanceCounter QueryPerformanceCounter "kernel32.dll"
 #pragma dynimport runtime·QueryPerformanceFrequency QueryPerformanceFrequency "kernel32.dll"
+#pragma dynimport runtime·SetConsoleCtrlHandler SetConsoleCtrlHandler "kernel32.dll"
 #pragma dynimport runtime·SetEvent SetEvent "kernel32.dll"
 #pragma dynimport runtime·WaitForSingleObject WaitForSingleObject "kernel32.dll"
 #pragma dynimport runtime·WriteFile WriteFile "kernel32.dll"
@@ -33,6 +34,7 @@ extern void *runtime·GetStdHandle;
 extern void *runtime·LoadLibraryEx;
 extern void *runtime·QueryPerformanceCounter;
 extern void *runtime·QueryPerformanceFrequency;
+extern void *runtime·SetConsoleCtrlHandler;
 extern void *runtime·SetEvent;
 extern void *runtime·WaitForSingleObject;
 extern void *runtime·WriteFile;
@@ -43,6 +45,7 @@ void
 runtime·osinit(void)
 {
        runtime·stdcall(runtime·QueryPerformanceFrequency, 1, &timerfreq);
+       runtime·stdcall(runtime·SetConsoleCtrlHandler, 2, runtime·ctrlhandler, 1);
 }
 
 void
@@ -161,6 +164,7 @@ runtime·destroylock(Lock *l)
 void
 runtime·noteclear(Note *n)
 {
+       n->lock.key = 0;        // memset(n, 0, sizeof *n)
        eventlock(&n->lock);
 }
 
@@ -279,6 +283,41 @@ runtime·sigpanic(void)
        runtime·throw("fault");
 }
 
+String
+runtime·signame(int32 sig)
+{
+       int8 *s;
+
+       switch(sig) {
+       case SIGINT:
+               s = "SIGINT: interrupt";
+               break;
+       default:
+               return runtime·emptystring;
+       }
+       return runtime·gostringnocopy((byte*)s);
+}
+
+uint32
+runtime·ctrlhandler1(uint32 type)
+{
+       int32 s;
+
+       switch(type) {
+       case CTRL_C_EVENT:
+       case CTRL_BREAK_EVENT:
+               s = SIGINT;
+               break;
+       default:
+               return 0;
+       }
+
+       if(runtime·sigsend(s))
+               return 1;
+       runtime·exit(2);       // SIGINT, SIGTERM, etc
+       return 0;
+}
+
 // Call back from windows dll into go.
 byte *
 runtime·compilecallback(Eface fn, bool cleanstack)