console separation 2/4

Eric Pouech eric.pouech at wanadoo.fr
Tue Jul 30 14:24:34 CDT 2002


dispatching signals from ntdll
-------------- next part --------------
Name:          con_sighook
ChangeLog:     added a generic mechanism to set up hooks for dispatching signal handlers outside ntdll
License:       X11
GenDate:       2002/07/30 19:17:12 UTC
ModifiedFiles: dlls/ntdll/Makefile.in dlls/ntdll/ntdll.spec dlls/ntdll/signal_i386.c dlls/ntdll/signal_sparc.c dlls/kernel/kernel_main.c
AddedFiles:    dlls/ntdll/signal.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/ntdll/Makefile.in,v
retrieving revision 1.29
diff -u -u -r1.29 Makefile.in
--- dlls/ntdll/Makefile.in	10 Jul 2002 23:22:29 -0000	1.29
+++ dlls/ntdll/Makefile.in	30 Jul 2002 12:17:13 -0000
@@ -110,6 +108,7 @@
 	rtlstr.c \
 	string.c \
 	sec.c \
+	signal.c \
 	signal_i386.c \
 	signal_sparc.c \
 	sync.c \
Index: dlls/ntdll/ntdll.spec
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/ntdll/ntdll.spec,v
retrieving revision 1.71
diff -u -u -r1.71 ntdll.spec
--- dlls/ntdll/ntdll.spec	28 Jul 2002 17:49:26 -0000	1.71
+++ dlls/ntdll/ntdll.spec	30 Jul 2002 09:12:02 -0000
@@ -1026,3 +1026,6 @@
 
 # Codepages
 @ cdecl __wine_init_codepages(ptr ptr) __wine_init_codepages
+
+# signal handling
+@ cdecl __wine_set_signal_handler(long ptr) __wine_set_signal_handler
Index: dlls/ntdll/signal_i386.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/ntdll/signal_i386.c,v
retrieving revision 1.40
diff -u -u -r1.40 signal_i386.c
--- dlls/ntdll/signal_i386.c	22 Jul 2002 20:47:11 -0000	1.40
+++ dlls/ntdll/signal_i386.c	30 Jul 2002 09:17:25 -0000
@@ -54,6 +54,8 @@
 
 #include "selectors.h"
 
+extern int     wine_dispatch_signal(unsigned sig);
+
 /***********************************************************************
  * signal context platform-specific definitions
  */
@@ -974,8 +976,7 @@
  */
 static HANDLER_DEF(int_handler)
 {
-    extern int CONSOLE_HandleCtrlC(void);
-    if (!CONSOLE_HandleCtrlC())
+    if (!wine_dispatch_signal(SIGINT))
     {
         EXCEPTION_RECORD rec;
         CONTEXT context;
Index: dlls/ntdll/signal_sparc.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/ntdll/signal_sparc.c,v
retrieving revision 1.15
diff -u -u -r1.15 signal_sparc.c
--- dlls/ntdll/signal_sparc.c	21 Jun 2002 20:10:07 -0000	1.15
+++ dlls/ntdll/signal_sparc.c	30 Jul 2002 09:17:22 -0000
@@ -38,6 +38,8 @@
 
 #include "wine/debug.h"
 
+extern int     wine_dispatch_signal(unsigned sig);
+
 WINE_DEFAULT_DEBUG_CHANNEL(seh);
 
 static sigset_t all_sigs;
@@ -310,8 +312,7 @@
  */
 static void int_handler( int signal, siginfo_t *info, ucontext_t *ucontext )
 {
-    extern int CONSOLE_HandleCtrlC(void);
-    if (!CONSOLE_HandleCtrlC())
+    if (!wine_dispatch_signal(SIGINT))
     {
         EXCEPTION_RECORD rec;
         CONTEXT context;
Index: dlls/kernel/kernel_main.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/kernel/kernel_main.c,v
retrieving revision 1.29
diff -u -u -r1.29 kernel_main.c
--- dlls/kernel/kernel_main.c	16 May 2002 20:32:16 -0000	1.29
+++ dlls/kernel/kernel_main.c	30 Jul 2002 19:13:54 -0000
@@ -24,20 +24,23 @@
 #include <ctype.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <signal.h>
 
 #include "winbase.h"
 
 #include "wine/winbase16.h"
 #include "wine/library.h"
 #include "file.h"
 #include "global.h"
 #include "miscemu.h"
 #include "module.h"
 #include "task.h"
 
 extern void CODEPAGE_Init(void);
 extern BOOL RELAY_Init(void);
 
+extern  int __wine_set_signal_handler(unsigned, int (*)(unsigned));
+extern  int CONSOLE_HandleCtrlC(unsigned);
 
 /***********************************************************************
  *           KERNEL process initialisation routine
@@ -99,6 +105,9 @@
 
     /* Create the shared heap for broken win95 native dlls */
     HeapCreate( HEAP_SHARED, 0, 0 );
+
+    /* finish the process initialisation, if needed */
+    __wine_set_signal_handler(SIGINT, CONSOLE_HandleCtrlC);
 
     return TRUE;
 }
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/ntdll/signal.c	Tue Jul 30 13:53:55 2002
@@ -0,0 +1,21 @@
+#include <stdlib.h>
+
+typedef int (*wine_signal_handler)(unsigned sig);
+
+static  wine_signal_handler handlers[256];
+
+int     __wine_set_signal_handler(unsigned sig, wine_signal_handler wsh)
+{
+    if (sig > sizeof(handlers) / sizeof(handlers[0])) return -1;
+    if (handlers[sig] != NULL) return -2;
+
+    handlers[sig] = wsh;
+
+    return 0;
+}
+
+int     wine_dispatch_signal(unsigned sig)
+{
+    if (handlers[sig] == NULL) return 0;
+    return handlers[sig](sig);
+}


More information about the wine-patches mailing list