diff options
Diffstat (limited to 'asmrun/signals.c')
-rw-r--r-- | asmrun/signals.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/asmrun/signals.c b/asmrun/signals.c index 0262f237a..5f3046514 100644 --- a/asmrun/signals.c +++ b/asmrun/signals.c @@ -52,18 +52,23 @@ extern char * caml_code_area_start, * caml_code_area_end; ((char *)(pc) >= caml_code_area_start && \ (char *)(pc) <= caml_code_area_end) +intnat volatile caml_signals_are_pending = 0; volatile intnat caml_pending_signals[NSIG]; volatile int caml_force_major_slice = 0; value caml_signal_handlers = 0; static void caml_process_pending_signals(void) { - int signal_num; - intnat signal_state; + int i; - for (signal_num = 0; signal_num < NSIG; signal_num++) { - Read_and_clear(signal_state, caml_pending_signals[signal_num]); - if (signal_state) caml_execute_signal(signal_num, 0); + if (caml_signals_are_pending) { + caml_signals_are_pending = 0; + for (i = 0; i < NSIG; i++) { + if (caml_pending_signals[i]) { + caml_pending_signals[i] = 0; + caml_execute_signal(i, 0); + } + } } } @@ -132,6 +137,7 @@ void caml_execute_signal(int signal_number, int in_signal_handler) void caml_record_signal(int signal_number) { caml_pending_signals[signal_number] = 1; + caml_signals_are_pending = 1; caml_young_limit = caml_young_end; } @@ -153,10 +159,7 @@ void caml_garbage_collection(void) if (caml_young_ptr < caml_young_start || caml_force_major_slice) { caml_minor_collection(); } - for (signal_number = 0; signal_number < NSIG; signal_number++) { - Read_and_clear(signal_state, caml_pending_signals[signal_number]); - if (signal_state) caml_execute_signal(signal_number, 0); - } + caml_process_pending_signals(); } /* Trigger a garbage collection as soon as possible */ @@ -173,18 +176,13 @@ void caml_urge_major_slice (void) void caml_enter_blocking_section(void) { - int i; - intnat pending; - while (1){ /* Process all pending signals now */ caml_process_pending_signals(); caml_enter_blocking_section_hook (); - /* Check again for pending signals. */ - pending = 0; - for (i = 0; i < NSIG; i++) pending |= caml_pending_signals[i]; - /* If none, done; otherwise, try again */ - if (!pending) break; + /* Check again for pending signals. + If none, done; otherwise, try again */ + if (! caml_signals_are_pending) break; caml_leave_blocking_section_hook (); } } |