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:
parent
ea2909fdb8
commit
8e6a6738bb
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user