annotate libcruft/misc/cquit.c @ 8920:eb63fbe60fab

update copyright notices
author John W. Eaton <jwe@octave.org>
date Sat, 07 Mar 2009 10:41:27 -0500
parents dea5bd01e6d7
children 1ddc25c3623a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
1 /*
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
2
8920
eb63fbe60fab update copyright notices
John W. Eaton <jwe@octave.org>
parents: 8838
diff changeset
3 Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009 John W. Eaton
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
4
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
5 This file is part of Octave.
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
6
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5775
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5775
diff changeset
10 option) any later version.
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
11
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
15 for more details.
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
16
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5775
diff changeset
18 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5775
diff changeset
19 <http://www.gnu.org/licenses/>.
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
20
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
21 */
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
22
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
24 #include <config.h>
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
25 #endif
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
26
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
27 #include <signal.h>
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
28 #include <string.h>
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
29
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
30 #include "quit.h"
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
31
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
32 octave_jmp_buf current_context;
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
33
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
34 void
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
35 octave_save_current_context (void *save_buf)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
36 {
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
37 memcpy (save_buf, current_context, sizeof (octave_jmp_buf));
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
38 }
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
39
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
40 void
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
41 octave_restore_current_context (void *save_buf)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
42 {
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
43 memcpy (current_context, save_buf, sizeof (octave_jmp_buf));
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
44 }
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
45
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
46 #if defined (__WIN32__) && ! defined (_POSIX_VERSION)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
47
5775
ace8d8d26933 [project @ 2006-04-24 19:13:06 by jwe]
jwe
parents: 5451
diff changeset
48 /* FIXME -- eventually remove the debugging */
5451
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
49 #if defined (DEBUG)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
50
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
51 #define PRINT_CURRENT_THREAD() printf ("%lx: ", GetCurrentThreadId ())
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
52
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
53 #define DEBUGs(s) \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
54 do \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
55 { \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
56 PRINT_CURRENT_THREAD (); \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
57 printf (s "\n"); \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
58 fflush (stdout); \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
59 } \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
60 while (0)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
61
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
62 #define DEBUGd(s, d) \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
63 do \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
64 { \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
65 PRINT_CURRENT_THREAD (); \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
66 printf (s "\n", d); \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
67 fflush (stdout); \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
68 } \
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
69 while (0)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
70
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
71 #else
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
72 #define DEBUGs(s)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
73 #define DEBUGd(s, d)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
74 #endif
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
75
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
76 CRITICAL_SECTION w32_thread_setjmp_mutex;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
77 static CONTEXT w32_signal_context;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
78 static int w32_signal_to_raise = 0;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
79 static DWORD w32_main_thread_id;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
80 static HANDLE w32_main_thread;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
81 static HANDLE w32_restore_thread = NULL;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
82
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
83 int
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
84 w32_in_main_thread(void)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
85 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
86 return (GetCurrentThreadId () == w32_main_thread_id);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
87 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
88
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
89 static DWORD WINAPI
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
90 w32_reset_context (LPVOID v)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
91 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
92 PCONTEXT context = (PCONTEXT)v;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
93 int ret;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
94
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
95 /* Mutex the setjmp/longjmp */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
96 EnterCriticalSection (&w32_thread_setjmp_mutex);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
97
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
98 DEBUGs ("enter w32_set_context");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
99 SuspendThread (w32_main_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
100 DEBUGs ("main suspended");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
101 if (! SetThreadContext (w32_main_thread, context))
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
102 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
103 fprintf (stderr, "%lx: context failed: ctrl-c won't work\n",
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
104 GetCurrentThreadId ());
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
105 fflush (stderr);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
106 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
107 DEBUGs ("context captured (or not)");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
108 ret = ResumeThread (w32_main_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
109 DEBUGd ("main resumed with %d", ret);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
110
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
111 LeaveCriticalSection (&w32_thread_setjmp_mutex);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
112 return 0;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
113 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
114
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
115 static void
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
116 w32_raise_in_main (void)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
117 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
118 DWORD threadid;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
119
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
120 DEBUGd ("w32_raise_in_main with signal %d", w32_signal_to_raise);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
121 raise (w32_signal_to_raise);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
122 DEBUGd ("w32_raise_in_main signal %d returned a value",
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
123 w32_signal_to_raise);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
124
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
125 DEBUGs ("attempting to restore main to pre-signal configuration");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
126 if (w32_restore_thread != NULL) /* Catch leaky threads */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
127 CloseHandle (w32_restore_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
128 w32_restore_thread = CreateThread (NULL, 10000, w32_reset_context,
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
129 &w32_signal_context, 0, &threadid);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
130 if (w32_restore_thread == NULL)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
131 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
132 fprintf (stderr, "w32_raise_in_main couldn't create thread\n");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
133 fflush (stderr);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
134 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
135 else
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
136 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
137 DEBUGs ("waiting to restore raise context");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
138 WaitForSingleObject (w32_restore_thread, INFINITE);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
139 fprintf (stderr, "w32_raise_in_main couldn't restore context\n");
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
140 fflush (stderr);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
141 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
142 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
143
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
144 void
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
145 w32_raise_final (void)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
146 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
147 CloseHandle (w32_main_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
148 if (w32_restore_thread != NULL) /* Catch leaky threads */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
149 CloseHandle (w32_restore_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
150 w32_main_thread = w32_restore_thread = NULL;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
151 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
152
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
153 /* Raise the given signal in the main thread. w32_raise_init ()
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
154 must have been called from the main thread already. */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
155 void
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
156 w32_raise (int sig)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
157 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
158 int ret;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
159
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
160 if (w32_in_main_thread ())
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
161 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
162 /* Called from main thread -- a simple raise () should work. */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
163 DEBUGd ("raising signal %d within main", signal);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
164 raise (sig);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
165 DEBUGd ("returning from signal %d within main", signal);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
166 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
167 else
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
168 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
169 /* Called from alternate thread -- call w32_raise_in_main in the
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
170 main thread with w32_signal_to_raise set to the signal */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
171 CONTEXT raise_context;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
172 DEBUGd ("raising signal %d from separate thread", signal);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
173
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
174 /* Suspend main and remember the context. */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
175 SuspendThread (w32_main_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
176 /* X86 code */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
177 w32_signal_context.ContextFlags
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
178 = CONTEXT_FULL|CONTEXT_FLOATING_POINT|CONTEXT_DEBUG_REGISTERS;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
179 GetThreadContext (w32_main_thread, &w32_signal_context);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
180
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
181 /* Change the context to w32_raise_in_main. The
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
182 context.Eip=&fn trick for setting the program counter is
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
183 courtesy of
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
184
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
185 http://fit.c2.com/files/LispPlatform/lisp/clisp-2.28/src/win32aux.d
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
186
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
187 Auxiliary functions for CLISP on Win32, Bruno Haible
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
188 1997-1999. */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
189
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
190 memcpy (&raise_context, &w32_signal_context, sizeof (CONTEXT));
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
191 raise_context.Eip = (DWORD)&w32_raise_in_main; /* X86 code */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
192 w32_signal_to_raise = sig;
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
193 SetThreadContext (w32_main_thread, &raise_context);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
194
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
195 /* Resume main at w32_raise_in_main */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
196 ret = ResumeThread (w32_main_thread);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
197 DEBUGd ("main resumed at w32_raise_in_main with suspend count %d",
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
198 ret);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
199 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
200 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
201
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
202 void
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
203 w32_sigint_init (void)
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
204 {
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
205 /* Capture main context */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
206 w32_main_thread_id = GetCurrentThreadId ();
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
207 DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
208 GetCurrentProcess (), &w32_main_thread,
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
209 0, FALSE, DUPLICATE_SAME_ACCESS);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
210
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
211 InitializeCriticalSectionAndSpinCount (&w32_thread_setjmp_mutex, 0);
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
212 }
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
213
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
214 #endif /* #if defined (__WIN32__) && ! defined (_POSIX_VERSION) */
ed08548b9054 [project @ 2005-09-15 19:52:50 by jwe]
jwe
parents: 5307
diff changeset
215
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
216 void
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
217 octave_jump_to_enclosing_context (void)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
218 {
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
219 #if defined (OCTAVE_HAVE_SIG_JUMP)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
220 siglongjmp (current_context, 1);
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
221 #else
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
222 longjmp (current_context, 1);
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
223 #endif
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
224 }
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
225
4572
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
226 /* Allow us to save the signal mask and then restore it to the most
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
227 recently saved value. This is necessary when using the POSIX
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
228 signal handling interface on some systems calling longjmp out of
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
229 the signal handler to get to the top level on an interrupt doesn't
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
230 restore the original signal mask. Alternatively, we could use
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
231 sigsetjmp/siglongjmp, but saving and restoring the signal mask
4623ef02a605 [project @ 2003-10-31 03:07:05 by jwe]
jwe
parents: 4571
diff changeset
232 ourselves works ok and seems simpler just now. */
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
233
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
234 #if defined (HAVE_POSIX_SIGNALS)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
235 static sigset_t octave_signal_mask;
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
236 #endif
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
237
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
238 void
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
239 octave_save_signal_mask (void)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
240 {
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
241 #if defined (HAVE_POSIX_SIGNALS)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
242 sigprocmask (0, 0, &octave_signal_mask);
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
243 #endif
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
244 }
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
245
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
246 void
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
247 octave_restore_signal_mask (void)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
248 {
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
249 #if defined (HAVE_POSIX_SIGNALS)
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
250 sigprocmask (SIG_SETMASK, &octave_signal_mask, 0);
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
251 #endif
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
252 }
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
253
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
254 sig_atomic_t octave_interrupt_immediately = 0;
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
255
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
256 sig_atomic_t octave_interrupt_state = 0;
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
257
7481
78f3811155f7 use exceptions in liboctave error handler
John W. Eaton <jwe@octave.org>
parents: 7017
diff changeset
258 sig_atomic_t octave_exception_state = 0;
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
259
8838
dea5bd01e6d7 omission from last patch
Jaroslav Hajek <highegg@gmail.com>
parents: 7481
diff changeset
260 volatile sig_atomic_t octave_signal_caught = 0;
5142
0f9108f298ab [project @ 2005-02-12 02:29:34 by jwe]
jwe
parents: 4572
diff changeset
261
4571
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
262 /*
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
263 ;;; Local Variables: ***
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
264 ;;; mode: C++ ***
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
265 ;;; End: ***
ef4bdde0805d [project @ 2003-10-30 16:48:09 by jwe]
jwe
parents:
diff changeset
266 */