From 8e6a6738bbf688263218a57d2f3d57b326a0e096 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 5 Jul 2012 08:34:55 -0600 Subject: [PATCH] futures: improve x87 consistency Each future thread has its own x87 flags, apparently reset to the default (at least on Mac OS X) rather than inherited from the creating thread, so reset the x87 configuration in each new future thread. --- src/racket/sconfig.h | 6 +++- src/racket/src/future.c | 2 ++ src/racket/src/number.c | 59 ++++++++++++++++++++++------------------ src/racket/src/schpriv.h | 2 ++ 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/racket/sconfig.h b/src/racket/sconfig.h index 3188560562..f5b923c5c5 100644 --- a/src/racket/sconfig.h +++ b/src/racket/sconfig.h @@ -763,9 +763,13 @@ # define MZ_USE_JIT_I386 # ifndef MZ_NO_JIT_SSE # define MZ_USE_JIT_SSE -# define ASM_DBLPREC_CONTROL_87 # endif #endif + +#ifdef MZ_NO_JIT_SSE +# define ASM_DBLPREC_CONTROL_87 +#endif + # define MZ_JIT_USE_MPROTECT # define FLAGS_ALREADY_SET diff --git a/src/racket/src/future.c b/src/racket/src/future.c index 41caccb141..9dc48c1095 100644 --- a/src/racket/src/future.c +++ b/src/racket/src/future.c @@ -2151,6 +2151,8 @@ void *worker_thread_future_loop(void *arg) mzrt_mutex_unlock(fs->future_mutex); */ + scheme_configure_floating_point(); + mzrt_sema_create(&fts->worker_can_continue_sema, 0); scheme_use_rtcall = 1; diff --git a/src/racket/src/number.c b/src/racket/src/number.c index bd5b56e506..8ac33b3074 100644 --- a/src/racket/src/number.c +++ b/src/racket/src/number.c @@ -213,32 +213,11 @@ static void to_extended_prec(void) } #endif -void -scheme_init_number (Scheme_Env *env) -{ - Scheme_Object *p; - REGISTER_SO(scheme_pi); - REGISTER_SO(scheme_half_pi); - REGISTER_SO(scheme_zerod); - REGISTER_SO(scheme_nzerod); -#ifdef MZ_USE_SINGLE_FLOATS - REGISTER_SO(scheme_single_pi); - REGISTER_SO(scheme_zerof); - REGISTER_SO(scheme_nzerof); -#endif - REGISTER_SO(scheme_plus_i); - REGISTER_SO(scheme_minus_i); - REGISTER_SO(scheme_inf_object); - REGISTER_SO(scheme_minus_inf_object); - REGISTER_SO(scheme_nan_object); -#ifdef MZ_USE_SINGLE_FLOATS - REGISTER_SO(scheme_single_inf_object); - REGISTER_SO(scheme_single_minus_inf_object); - REGISTER_SO(scheme_single_nan_object); -#endif - - START_XFORM_SKIP; +void scheme_configure_floating_point(void) + XFORM_SKIP_PROC +/* can be called in any thread */ +{ #ifndef DONT_IGNORE_FPE_SIGNAL MZ_SIGSET(SIGFPE, SIG_IGN); #endif @@ -270,7 +249,35 @@ scheme_init_number (Scheme_Env *env) #ifdef ASM_DBLPREC_CONTROL_87 to_double_prec(); #endif - END_XFORM_SKIP; +} + + +void +scheme_init_number (Scheme_Env *env) +{ + Scheme_Object *p; + + REGISTER_SO(scheme_pi); + REGISTER_SO(scheme_half_pi); + REGISTER_SO(scheme_zerod); + REGISTER_SO(scheme_nzerod); +#ifdef MZ_USE_SINGLE_FLOATS + REGISTER_SO(scheme_single_pi); + REGISTER_SO(scheme_zerof); + REGISTER_SO(scheme_nzerof); +#endif + REGISTER_SO(scheme_plus_i); + REGISTER_SO(scheme_minus_i); + REGISTER_SO(scheme_inf_object); + REGISTER_SO(scheme_minus_inf_object); + REGISTER_SO(scheme_nan_object); +#ifdef MZ_USE_SINGLE_FLOATS + REGISTER_SO(scheme_single_inf_object); + REGISTER_SO(scheme_single_minus_inf_object); + REGISTER_SO(scheme_single_nan_object); +#endif + + scheme_configure_floating_point(); #if defined(HUGE_VAL) && !defined(USE_DIVIDE_MAKE_INFINITY) scheme_infinity_val = HUGE_VAL; diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 2ef8bfb090..1aa4183832 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -1773,6 +1773,8 @@ intptr_t scheme_get_semaphore_init(const char *who, int n, Scheme_Object **p); # define scheme_exact_one scheme_make_integer(1) #endif +void scheme_configure_floating_point(void); + /****** Bignums *******/ #ifdef USE_LONG_LONG_FOR_BIGDIG