mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-04-27 11:40:45 -07:00
Change SI:CATCH-SIGNAL to accept a keyword argument :LOCAL and have only thread-local influence (only works in POSIX)
This commit is contained in:
parent
cf999213d3
commit
7278358db3
2 changed files with 24 additions and 11 deletions
|
|
@ -661,9 +661,10 @@ ecl_check_pending_interrupts(void)
|
|||
}
|
||||
}
|
||||
|
||||
cl_object
|
||||
si_catch_signal(cl_object code, cl_object boolean)
|
||||
@(defun ext::catch-signal (code flag &key local)
|
||||
@
|
||||
{
|
||||
cl_object output = Cnil;
|
||||
int code_int = fixnnint(code);
|
||||
int i;
|
||||
#ifdef GBC_BOEHM
|
||||
|
|
@ -686,17 +687,28 @@ si_catch_signal(cl_object code, cl_object boolean)
|
|||
#endif
|
||||
for (i = 0; known_signals[i].code >= 0; i++) {
|
||||
if (known_signals[i].code == code_int) {
|
||||
if (Null(boolean)) {
|
||||
signal(code_int, SIG_DFL);
|
||||
output = Ct;
|
||||
#if defined(ECL_THREADS) && defined(HAVE_SIGPROCMASK)
|
||||
if (local) {
|
||||
sigset_t handled_set;
|
||||
pthread_sigmask(SIG_SETMASK, NULL, &handled_set);
|
||||
if (Null(flag)) {
|
||||
sigdelset(&handled_set, code_int);
|
||||
} else {
|
||||
sigaddset(&handled_set, code_int);
|
||||
}
|
||||
pthread_sigmask(SIG_SETMASK, &handled_set, NULL);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (Null(flag)) {
|
||||
signal(code_int, SIG_DFL);
|
||||
} else if (code_int == SIGSEGV) {
|
||||
mysignal(code_int, sigsegv_handler);
|
||||
break;
|
||||
}
|
||||
#ifdef SIGBUS
|
||||
else if (code_int == SIGBUS) {
|
||||
mysignal(code_int, sigbus_handler);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef SIGCHLD
|
||||
|
|
@ -704,16 +716,17 @@ si_catch_signal(cl_object code, cl_object boolean)
|
|||
#ifndef ECL_THREADS
|
||||
mysignal(SIGCHLD, non_evil_signal_handler);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
else {
|
||||
mysignal(code_int, non_evil_signal_handler);
|
||||
@(return Ct)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@(return Cnil)
|
||||
@(return output)
|
||||
}
|
||||
@)
|
||||
|
||||
#ifdef ECL_THREADS
|
||||
# ifdef ECL_WINDOWS_THREADS
|
||||
|
|
|
|||
|
|
@ -1856,7 +1856,7 @@ extern ECL_API cl_object si_copy_file(cl_object orig, cl_object end);
|
|||
#define ECL_PSEUDO_ATOMIC_ENV(env,stmt) (ecl_disable_interrupts_env(env),(stmt),ecl_enable_interrupts_env(env))
|
||||
#define ECL_PSEUDO_ATOMIC(stmt) (ecl_disable_interrupts(),(stmt),ecl_enable_interrupts())
|
||||
extern ECL_API cl_object si_handle_signal(cl_object signal);
|
||||
extern ECL_API cl_object si_catch_signal(cl_object signal, cl_object state);
|
||||
extern ECL_API cl_object si_catch_signal(cl_narg narg, cl_object signal, cl_object state, ...);
|
||||
extern ECL_API cl_object si_check_pending_interrupts(void);
|
||||
extern ECL_API cl_object si_disable_interrupts(void);
|
||||
extern ECL_API cl_object si_enable_interrupts(void);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue