>From 5999d00ed9b35db1f645890001ed941093a4a6bb Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Wed, 13 Jun 2012 22:54:26 +0200 Subject: [PATCH] Use sigsetjmp/siglongjmp instead of setjmp/longjmp on platforms where these are available to prevent inadvertent resetting of signal mask and the associated unneccessary system call overhead --- Makefile.bsd | 1 + Makefile.linux | 1 + Makefile.macosx | 1 + NEWS | 2 ++ chicken.h | 13 +++++++++++-- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Makefile.bsd b/Makefile.bsd index 7c545af..4402c03 100644 --- a/Makefile.bsd +++ b/Makefile.bsd @@ -84,6 +84,7 @@ chicken-config.h: chicken-defaults.h echo "#define HAVE_MEMMOVE 1" >>$@ echo "#define HAVE_MEMORY_H 1" >>$@ echo "#define HAVE_SIGACTION 1" >>$@ + echo "#define HAVE_SIGSETJMP 1" >>$@ echo "#define HAVE_STDINT_H 1" >>$@ echo "#define HAVE_STDLIB_H 1" >>$@ echo "#define HAVE_STRERROR 1" >>$@ diff --git a/Makefile.linux b/Makefile.linux index 37f848c..c55d55e 100644 --- a/Makefile.linux +++ b/Makefile.linux @@ -73,6 +73,7 @@ chicken-config.h: chicken-defaults.h echo "#define HAVE_MEMMOVE 1" >>$@ echo "#define HAVE_MEMORY_H 1" >>$@ echo "#define HAVE_SIGACTION 1" >>$@ + echo "#define HAVE_SIGSETJMP 1" >>$@ echo "#define HAVE_STDINT_H 1" >>$@ echo "#define HAVE_STDLIB_H 1" >>$@ echo "#define HAVE_STRERROR 1" >>$@ diff --git a/Makefile.macosx b/Makefile.macosx index fdb2483..a0a73fa 100644 --- a/Makefile.macosx +++ b/Makefile.macosx @@ -97,6 +97,7 @@ chicken-config.h: chicken-defaults.h echo "#define HAVE_MEMMOVE 1" >>$@ echo "#define HAVE_MEMORY_H 1" >>$@ echo "#define HAVE_SIGACTION 1" >>$@ + echo "#define HAVE_SIGSETJMP 1" >>$@ echo "#define HAVE_STDINT_H 1" >>$@ echo "#define HAVE_STDLIB_H 1" >>$@ echo "#define HAVE_STRERROR 1" >>$@ diff --git a/NEWS b/NEWS index 4b31d83..136dbc9 100644 --- a/NEWS +++ b/NEWS @@ -241,6 +241,8 @@ and "-heap-shrinkage" - the assembly-language stub routine for the implementation of "apply" was broken for Sparc64 systems and has been disabled for this platform + - signal masks were accedentally reset upon GC for some platforms; use + sigsetjmp/siglongjmp on BSD, Linux and MacOS X - Type system - added new type-specifiers "input-port", "output-port", "(list-of T)" diff --git a/chicken.h b/chicken.h index 837a51c..6e9e009 100644 --- a/chicken.h +++ b/chicken.h @@ -874,8 +874,17 @@ DECL_C_PROC_p0 (128, 1,0,0,0,0,0,0,0) # define C_gettimeofday gettimeofday # define C_gmtime gmtime # define C_localtime localtime -# define C_setjmp setjmp -# define C_longjmp longjmp +/* + * It is undefined whether regular setjmp/longjmp save/restore signal mask + * so try to use versions that we know won't try to save & restore. + */ +# if defined(HAVE_SIGSETJMP) +# define C_setjmp(e) sigsetjmp(e, 0) +# define C_longjmp(e,v) siglongjmp(e, v) +# else +# define C_setjmp setjmp +# define C_longjmp longjmp +# endif # define C_alloca alloca # define C_strerror strerror # define C_isalpha isalpha -- 1.7.9.1