CAMLexport void caml_enter_blocking_section(void) { while (1){ /* Process all pending signals now */ caml_process_pending_signals(); caml_enter_blocking_section_hook (); /* Check again for pending signals. If none, done; otherwise, try again */ if (! caml_signals_are_pending) break; caml_leave_blocking_section_hook (); } }
static void handle_signal(int signal_number) { #if !defined(POSIX_SIGNALS) && !defined(BSD_SIGNALS) signal(signal_number, handle_signal); #endif if (signal_number < 0 || signal_number >= NSIG) return; if (caml_try_leave_blocking_section_hook()) { caml_execute_signal(signal_number, 1); caml_enter_blocking_section_hook(); }else{ caml_record_signal(signal_number); } }
static void handle_signal(int signal_number) { int saved_errno; /* Save the value of errno (PR#5982). */ saved_errno = errno; #if !defined(POSIX_SIGNALS) && !defined(BSD_SIGNALS) signal(signal_number, handle_signal); #endif if (signal_number < 0 || signal_number >= NSIG) return; if (caml_try_leave_blocking_section_hook()) { caml_execute_signal(signal_number, 1); caml_enter_blocking_section_hook(); }else{ caml_record_signal(signal_number); } errno = saved_errno; }