@@ -204,6 +204,7 @@ ex_context_t *ex_init(void) {
204
204
ex_signal_block (all );
205
205
ex_context = & ex_context_buffer ;
206
206
ex_context -> is_unwind = false;
207
+ ex_context -> caught = -1 ;
207
208
ex_context -> type = ex_context_st ;
208
209
ex_signal_unblock (all );
209
210
@@ -259,8 +260,7 @@ void ex_throw(const char *exception, const char *file, int line, const char *fun
259
260
ex_terminate ();
260
261
261
262
#ifdef _WIN32
262
- if (!is_empty ((void * )message ))
263
- RaiseException (EXCEPTION_PANIC , 0 , 0 , 0 );
263
+ RaiseException (EXCEPTION_PANIC , 0 , 0 , 0 );
264
264
#endif
265
265
ex_longjmp (ctx -> buf , ctx -> state | ex_throw_st );
266
266
}
@@ -272,7 +272,10 @@ int catch_seh(const char *exception, DWORD code, struct _EXCEPTION_POINTERS *ep)
272
272
int i ;
273
273
274
274
for (i = 0 ; i < max_ex_sig ; i ++ ) {
275
- if (ex_sig [i ].ex == exception || is_str_eq (ctx -> panic , exception )) {
275
+ if (is_str_eq (ex_sig [i ].ex , exception )
276
+ || is_str_eq (ctx -> panic , exception )
277
+ || ex_sig [i ].seh == code
278
+ || ctx -> caught == ex_sig [i ].seh ) {
276
279
ctx -> state = ex_throw_st ;
277
280
ctx -> ex = ex_sig [i ].ex ;
278
281
ctx -> file = "unknown" ;
@@ -299,7 +302,7 @@ int catch_filter_seh(DWORD code, struct _EXCEPTION_POINTERS *ep) {
299
302
}
300
303
301
304
for (i = 0 ; i < max_ex_sig ; i ++ ) {
302
- if (ex_sig [i ].seh == code ) {
305
+ if (ex_sig [i ].seh == code || ctx -> caught == ex_sig [ i ]. seh ) {
303
306
ctx -> state = ex_throw_st ;
304
307
ctx -> ex = ex_sig [i ].ex ;
305
308
ctx -> file = "unknown" ;
@@ -352,13 +355,34 @@ void ex_handler(int sig) {
352
355
for (i = 0 ; i < max_ex_sig ; i ++ ) {
353
356
if (ex_sig [i ].sig == sig ) {
354
357
ex = ex_sig [i ].ex ;
358
+ ex_init ()-> caught = sig ;
355
359
break ;
356
360
}
357
361
}
358
362
359
363
ex_throw (ex , "unknown" , 0 , NULL , NULL );
360
364
}
361
365
366
+ void ex_signal_reset (int sig ) {
367
+ #if defined(_WIN32 ) || defined(_WIN64 )
368
+ if (signal (sig , SIG_DFL ) == SIG_ERR )
369
+ fprintf (stderr , "Cannot install handler for signal no %d\n" ,
370
+ sig );
371
+ #else
372
+ /*
373
+ * Make signal handlers persistent.
374
+ */
375
+ ex_sig_sa .sa_handler = SIG_DFL ;
376
+ if (sigemptyset (& ex_sig_sa .sa_mask ) != 0 )
377
+ fprintf (stderr , "Cannot setup handler for signal no %d (%s)\n" ,
378
+ sig , ex );
379
+ else if (sigaction (sig , & ex_sig_sa , NULL ) != 0 )
380
+ fprintf (stderr , "Cannot restore handler for signal no %d (%s)\n" ,
381
+ sig , ex );
382
+ #endif
383
+ exception_signal_set = false;
384
+ }
385
+
362
386
void ex_signal (int sig , const char * ex ) {
363
387
int i ;
364
388
@@ -468,3 +492,60 @@ void ex_signal_setup(void) {
468
492
ex_signal (SIG_BUS , EX_NAME (sig_bus ));
469
493
#endif
470
494
}
495
+
496
+ void ex_signal_default (void ) {
497
+ #ifdef SIGSEGV
498
+ ex_signal_reset (SIGSEGV );
499
+ #endif
500
+
501
+ #if defined(SIGABRT )
502
+ ex_signal_reset (SIGABRT );
503
+ #endif
504
+
505
+ #ifdef SIGFPE
506
+ ex_signal_reset (SIGFPE );
507
+ #endif
508
+
509
+ #ifdef SIGILL
510
+ ex_signal_reset (SIGILL );
511
+ #endif
512
+
513
+ #ifdef SIGBREAK
514
+ ex_signal_reset (SIGBREAK );
515
+ #endif
516
+
517
+ #ifdef SIGINT
518
+ ex_signal_reset (SIGINT );
519
+ #endif
520
+
521
+ #ifdef SIGTERM
522
+ ex_signal_reset (SIGTERM );
523
+ #endif
524
+
525
+ #if !defined(_WIN32 )
526
+ #ifdef SIGQUIT
527
+ ex_signal_reset (SIGQUIT );
528
+ #endif
529
+
530
+ #ifdef SIGHUP
531
+ ex_signal_reset (SIGHUP );
532
+ #endif
533
+
534
+ #ifdef SIGWINCH
535
+ ex_signal_reset (SIGWINCH );
536
+ #endif
537
+ #ifdef SIGTRAP
538
+ ex_signal_reset (SIGTRAP );
539
+ #endif
540
+ #endif
541
+
542
+ #ifdef SIGALRM
543
+ ex_signal_reset (SIGALRM );
544
+ #endif
545
+
546
+ #ifdef SIGBUS
547
+ ex_signal_reset (SIGBUS );
548
+ #elif SIG_BUS
549
+ ex_signal_reset (SIG_BUS );
550
+ #endif
551
+ }
0 commit comments