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.
This commit is contained in:
Matthew Flatt 2012-07-05 08:34:55 -06:00
parent ea2909fdb8
commit 8e6a6738bb
4 changed files with 42 additions and 27 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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