42 lines · 846 B · C
RawDownload
#include "alloc.h"#include "misc.h"#include "mlvalues.h"#include "signals.h"#include "stacks.h"#include "fail.h"#include "instruct.h"#include "interp.h" Volatile int signal_is_pending = 0;int in_blocking_section = 0;Volatile CODE signal_handler;Volatile int signal_number; /* This is set by interprete in interp.c on initialization: */ CODE raise_break_exn; void execute_signal(void){  if (in_blocking_section) {    value clos;    clos = alloc(Closure_wosize, Closure_tag);    Code_val(clos) = signal_handler;    Env_val(clos) = Atom(0);    callback(clos, Val_int(signal_number));  } else {    signal_is_pending = 1;    something_to_do = 1;  }} void enter_blocking_section(void){  in_blocking_section = 1;  if (signal_is_pending) execute_signal();} void leave_blocking_section(void){  in_blocking_section = 0;}