@@ -87,19 +87,191 @@ private static PythonSignalState MakeSimpleSignalState(PythonContext context) {
87
87
}
88
88
89
89
90
- //Python signals
91
- public const int NSIG = 23 ;
92
- public const int SIGABRT = 22 ;
93
- public const int SIGBREAK = 21 ;
94
- public const int SIGFPE = 8 ;
95
- public const int SIGILL = 4 ;
96
- public const int SIGINT = 2 ;
97
- public const int SIGSEGV = 11 ;
98
- public const int SIGTERM = 15 ;
90
+ #region Generated Signal Codes
91
+
92
+ // *** BEGIN GENERATED CODE ***
93
+ // generated by function: generate_signal_codes from: generate_os_codes.py
94
+
95
+
96
+ public static int SIGABRT => RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) ? 22 : 6 ;
97
+
98
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
99
+ [ SupportedOSPlatform ( "linux" ) ]
100
+ [ SupportedOSPlatform ( "macos" ) ]
101
+ public static int SIGALRM => 14 ;
102
+
103
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Unix ) ]
104
+ [ SupportedOSPlatform ( "windows" ) ]
105
+ public static int SIGBREAK => 21 ;
106
+
107
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
108
+ [ SupportedOSPlatform ( "linux" ) ]
109
+ [ SupportedOSPlatform ( "macos" ) ]
110
+ public static int SIGBUS => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 10 : 7 ;
111
+
112
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
113
+ [ SupportedOSPlatform ( "linux" ) ]
114
+ [ SupportedOSPlatform ( "macos" ) ]
115
+ public static int SIGCHLD => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 20 : 17 ;
116
+
117
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . MacOSX ) ]
118
+ [ SupportedOSPlatform ( "linux" ) ]
119
+ public static int SIGCLD => 17 ;
120
+
121
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
122
+ [ SupportedOSPlatform ( "linux" ) ]
123
+ [ SupportedOSPlatform ( "macos" ) ]
124
+ public static int SIGCONT => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 19 : 18 ;
125
+
126
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . Unix ) ]
127
+ [ SupportedOSPlatform ( "macos" ) ]
128
+ public static int SIGEMT => 7 ;
129
+
130
+ public static int SIGFPE => 8 ;
131
+
132
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
133
+ [ SupportedOSPlatform ( "linux" ) ]
134
+ [ SupportedOSPlatform ( "macos" ) ]
135
+ public static int SIGHUP => 1 ;
136
+
137
+ public static int SIGILL => 4 ;
138
+
139
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . Unix ) ]
140
+ [ SupportedOSPlatform ( "macos" ) ]
141
+ public static int SIGINFO => 29 ;
142
+
143
+ public static int SIGINT => 2 ;
144
+
145
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
146
+ [ SupportedOSPlatform ( "linux" ) ]
147
+ [ SupportedOSPlatform ( "macos" ) ]
148
+ public static int SIGIO => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 23 : 29 ;
149
+
150
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
151
+ [ SupportedOSPlatform ( "linux" ) ]
152
+ [ SupportedOSPlatform ( "macos" ) ]
153
+ public static int SIGIOT => 6 ;
154
+
155
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
156
+ [ SupportedOSPlatform ( "linux" ) ]
157
+ [ SupportedOSPlatform ( "macos" ) ]
158
+ public static int SIGKILL => 9 ;
159
+
160
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
161
+ [ SupportedOSPlatform ( "linux" ) ]
162
+ [ SupportedOSPlatform ( "macos" ) ]
163
+ public static int SIGPIPE => 13 ;
164
+
165
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . MacOSX ) ]
166
+ [ SupportedOSPlatform ( "linux" ) ]
167
+ public static int SIGPOLL => 29 ;
168
+
169
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
170
+ [ SupportedOSPlatform ( "linux" ) ]
171
+ [ SupportedOSPlatform ( "macos" ) ]
172
+ public static int SIGPROF => 27 ;
173
+
174
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . MacOSX ) ]
175
+ [ SupportedOSPlatform ( "linux" ) ]
176
+ public static int SIGPWR => 30 ;
177
+
178
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
179
+ [ SupportedOSPlatform ( "linux" ) ]
180
+ [ SupportedOSPlatform ( "macos" ) ]
181
+ public static int SIGQUIT => 3 ;
182
+
183
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . MacOSX ) ]
184
+ [ SupportedOSPlatform ( "linux" ) ]
185
+ public static int SIGRTMAX => 64 ;
186
+
187
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . MacOSX ) ]
188
+ [ SupportedOSPlatform ( "linux" ) ]
189
+ public static int SIGRTMIN => 34 ;
190
+
191
+ public static int SIGSEGV => 11 ;
192
+
193
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows , PlatformID . MacOSX ) ]
194
+ [ SupportedOSPlatform ( "linux" ) ]
195
+ public static int SIGSTKFLT => 16 ;
196
+
197
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
198
+ [ SupportedOSPlatform ( "linux" ) ]
199
+ [ SupportedOSPlatform ( "macos" ) ]
200
+ public static int SIGSTOP => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 17 : 19 ;
201
+
202
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
203
+ [ SupportedOSPlatform ( "linux" ) ]
204
+ [ SupportedOSPlatform ( "macos" ) ]
205
+ public static int SIGSYS => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 12 : 31 ;
206
+
207
+ public static int SIGTERM => 15 ;
208
+
209
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
210
+ [ SupportedOSPlatform ( "linux" ) ]
211
+ [ SupportedOSPlatform ( "macos" ) ]
212
+ public static int SIGTRAP => 5 ;
213
+
214
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
215
+ [ SupportedOSPlatform ( "linux" ) ]
216
+ [ SupportedOSPlatform ( "macos" ) ]
217
+ public static int SIGTSTP => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 18 : 20 ;
218
+
219
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
220
+ [ SupportedOSPlatform ( "linux" ) ]
221
+ [ SupportedOSPlatform ( "macos" ) ]
222
+ public static int SIGTTIN => 21 ;
223
+
224
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
225
+ [ SupportedOSPlatform ( "linux" ) ]
226
+ [ SupportedOSPlatform ( "macos" ) ]
227
+ public static int SIGTTOU => 22 ;
228
+
229
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
230
+ [ SupportedOSPlatform ( "linux" ) ]
231
+ [ SupportedOSPlatform ( "macos" ) ]
232
+ public static int SIGURG => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 16 : 23 ;
233
+
234
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
235
+ [ SupportedOSPlatform ( "linux" ) ]
236
+ [ SupportedOSPlatform ( "macos" ) ]
237
+ public static int SIGUSR1 => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 30 : 10 ;
238
+
239
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
240
+ [ SupportedOSPlatform ( "linux" ) ]
241
+ [ SupportedOSPlatform ( "macos" ) ]
242
+ public static int SIGUSR2 => RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 31 : 12 ;
243
+
244
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
245
+ [ SupportedOSPlatform ( "linux" ) ]
246
+ [ SupportedOSPlatform ( "macos" ) ]
247
+ public static int SIGVTALRM => 26 ;
248
+
249
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
250
+ [ SupportedOSPlatform ( "linux" ) ]
251
+ [ SupportedOSPlatform ( "macos" ) ]
252
+ public static int SIGWINCH => 28 ;
253
+
254
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
255
+ [ SupportedOSPlatform ( "linux" ) ]
256
+ [ SupportedOSPlatform ( "macos" ) ]
257
+ public static int SIGXCPU => 24 ;
258
+
259
+ [ PythonHidden ( PlatformsAttribute . PlatformFamily . Windows ) ]
260
+ [ SupportedOSPlatform ( "linux" ) ]
261
+ [ SupportedOSPlatform ( "macos" ) ]
262
+ public static int SIGXFSZ => 25 ;
263
+
264
+ // *** END GENERATED CODE ***
265
+
266
+ #endregion
267
+
268
+ public static int NSIG => RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) ? 23 : RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? 32 : 65 ;
269
+
99
270
public const int SIG_DFL = 0 ;
100
271
public const int SIG_IGN = 1 ;
101
272
102
- //Windows signals
273
+
274
+ // Windows signals
103
275
[ SupportedOSPlatform ( "windows" ) , PythonHidden ( PlatformsAttribute . PlatformFamily . Unix ) ]
104
276
public const int CTRL_C_EVENT = 0 ;
105
277
[ SupportedOSPlatform ( "windows" ) , PythonHidden ( PlatformsAttribute . PlatformFamily . Unix ) ]
@@ -172,10 +344,10 @@ public static object default_int_handlerImpl(int signalnum, TraceBackFrame? fram
172
344
""" ) ]
173
345
public static object ? signal ( CodeContext /*!*/ context , int signalnum , object ? action ) {
174
346
// Negative scenarios - signalnum
175
- if ( signalnum <= 0 || signalnum >= NSIG ) {
176
- throw PythonOps . ValueError ( "signal number out of range " ) ;
177
- } else if ( Array . IndexOf ( _PySupportedSignals , signalnum ) == - 1 ) {
178
- throw new RuntimeException ( "no IronPython support for given signal") ;
347
+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) ) {
348
+ if ( Array . IndexOf ( _PySupportedSignals_Windows , signalnum ) == - 1 ) throw PythonOps . ValueError ( "invalid signal value " ) ;
349
+ } else {
350
+ if ( signalnum <= 0 || signalnum >= NSIG ) throw PythonOps . ValueError ( " signal number out of range ") ;
179
351
}
180
352
// Negative scenarios - action
181
353
if ( action == null ) {
@@ -198,10 +370,15 @@ public static object default_int_handlerImpl(int signalnum, TraceBackFrame? fram
198
370
}
199
371
}
200
372
373
+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Linux ) || RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ) {
374
+ // These signals cannot be handled
375
+ if ( signalnum == SIGKILL || signalnum == SIGSTOP ) throw PythonNT . GetOsError ( PythonErrno . EINVAL ) ;
376
+ }
201
377
object ? last_handler = null ;
202
378
lock ( GetPythonSignalState ( context ) . PySignalToPyHandler ) {
203
379
// CPython returns the previous handler for the signal
204
380
last_handler = getsignal ( context , signalnum ) ;
381
+ if ( last_handler is null ) throw PythonNT . GetOsError ( PythonErrno . EINVAL ) ;
205
382
// Set the new action
206
383
GetPythonSignalState ( context ) . PySignalToPyHandler [ signalnum ] = action ;
207
384
}
@@ -250,20 +427,54 @@ private class PythonSignalState {
250
427
251
428
public PythonSignalState ( PythonContext pc ) {
252
429
SignalPythonContext = pc ;
253
- PySignalToPyHandler = new Dictionary < int , object > ( ) {
254
- { SIGABRT , SIG_DFL } ,
255
- { SIGBREAK , SIG_DFL } ,
256
- { SIGFPE , SIG_DFL } ,
257
- { SIGILL , SIG_DFL } ,
258
- { SIGINT , default_int_handler } ,
259
- { SIGSEGV , SIG_DFL } ,
260
- { SIGTERM , SIG_DFL } ,
261
- } ;
430
+ int [ ] sigs = RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) ? _PySupportedSignals_Windows
431
+ : RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ? _PySupportedSignals_MacOS
432
+ : RuntimeInformation . IsOSPlatform ( OSPlatform . Linux ) ? _PySupportedSignals_Linux
433
+ : throw new NotSupportedException ( "Unsupported platform for signal module" ) ;
434
+
435
+ PySignalToPyHandler = new Dictionary < int , object > ( sigs . Length ) ;
436
+ object sig_dfl = ScriptingRuntimeHelpers . Int32ToObject ( SIG_DFL ) ;
437
+ object sig_ign = ScriptingRuntimeHelpers . Int32ToObject ( SIG_IGN ) ;
438
+ foreach ( int sig in sigs ) {
439
+ PySignalToPyHandler [ sig ] = sig_dfl ;
440
+ }
441
+ PySignalToPyHandler [ SIGINT ] = default_int_handler ;
442
+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . Linux ) || RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ) {
443
+ PySignalToPyHandler [ SIGPIPE ] = sig_ign ;
444
+ PySignalToPyHandler [ SIGXFSZ ] = sig_ign ;
445
+ }
446
+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ) {
447
+ PySignalToPyHandler . Remove ( SIGKILL ) ;
448
+ PySignalToPyHandler . Remove ( SIGSTOP ) ;
449
+ }
262
450
}
263
451
}
264
452
265
- // List of all Signals CPython supports on Windows. Notice the addition of '6'
266
- private static readonly int [ ] _PySupportedSignals = { SIGABRT , SIGBREAK , SIGFPE , SIGILL , SIGINT , SIGSEGV , SIGTERM , 6 } ;
453
+
454
+ #region Generated Supported Signals
455
+
456
+ // *** BEGIN GENERATED CODE ***
457
+ // generated by function: generate_supported_signals from: generate_os_codes.py
458
+
459
+ [ SupportedOSPlatform ( "linux" ) ]
460
+ private static readonly int [ ] _PySupportedSignals_Linux = [
461
+ SIGABRT , SIGALRM , SIGBUS , SIGCHLD , SIGCLD , SIGCONT , SIGFPE , SIGHUP , SIGILL , SIGINT , SIGIO , SIGIOT , SIGKILL , SIGPIPE , SIGPOLL , SIGPROF , SIGPWR , SIGQUIT , SIGRTMAX , SIGRTMIN , SIGSEGV , SIGSTKFLT , SIGSTOP , SIGSYS , SIGTERM , SIGTRAP , SIGTSTP , SIGTTIN , SIGTTOU , SIGURG , SIGUSR1 , SIGUSR2 , SIGVTALRM , SIGWINCH , SIGXCPU , SIGXFSZ
462
+ ] ;
463
+
464
+ [ SupportedOSPlatform ( "macos" ) ]
465
+ private static readonly int [ ] _PySupportedSignals_MacOS = [
466
+ SIGABRT , SIGALRM , SIGBUS , SIGCHLD , SIGCONT , SIGEMT , SIGFPE , SIGHUP , SIGILL , SIGINFO , SIGINT , SIGIO , SIGIOT , SIGKILL , SIGPIPE , SIGPROF , SIGQUIT , SIGSEGV , SIGSTOP , SIGSYS , SIGTERM , SIGTRAP , SIGTSTP , SIGTTIN , SIGTTOU , SIGURG , SIGUSR1 , SIGUSR2 , SIGVTALRM , SIGWINCH , SIGXCPU , SIGXFSZ
467
+ ] ;
468
+
469
+ [ SupportedOSPlatform ( "windows" ) ]
470
+ private static readonly int [ ] _PySupportedSignals_Windows = [
471
+ SIGABRT , SIGBREAK , SIGFPE , SIGILL , SIGINT , SIGSEGV , SIGTERM
472
+ ] ;
473
+
474
+
475
+ // *** END GENERATED CODE ***
476
+
477
+ #endregion
267
478
268
479
// Signature of Python functions that signal.signal(...) expects to be given
269
480
private delegate object PySignalHandler ( int signalnum , TraceBackFrame ? frame ) ;
0 commit comments