From e3a513aa0d9f133917ec7e914452a40eeee1b05a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 5 Feb 2007 14:26:41 +0000 Subject: [PATCH] fix scheduler bug; see plt-scheme 2007-Feb-5 post and reply svn: r5552 --- src/mzscheme/src/schpriv.h | 2 +- src/mzscheme/src/sema.c | 9 ++++++--- src/mzscheme/src/thread.c | 8 +++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 66e226ce99..d35ca785b7 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -385,7 +385,7 @@ typedef struct Scheme_Security_Guard { /* Always allocated on the stack: */ typedef struct { - int false_positive_ok; /* non-zero => return 1 to swap in thread rather than running Scheme code */ + Scheme_Thread *false_positive_ok; /* non-zero => return 1 to swap in thread rather than running Scheme code */ int potentially_false_positive; /* => returning 1 to swap thread in, but truth may be 0 */ Scheme_Object *current_syncing; double sleep_end; diff --git a/src/mzscheme/src/sema.c b/src/mzscheme/src/sema.c index 33515586cb..ea698bf82b 100644 --- a/src/mzscheme/src/sema.c +++ b/src/mzscheme/src/sema.c @@ -430,7 +430,10 @@ static void ext_get_into_line(Scheme_Object *ch, Scheme_Schedule_Info *sinfo) /* Get into line */ w = MALLOC_ONE_RT(Scheme_Channel_Syncer); w->so.type = scheme_channel_syncer_type; - w->p = scheme_current_thread; + if (sinfo->false_positive_ok) + w->p = sinfo->false_positive_ok; + else + w->p = scheme_current_thread; w->syncing = (Syncing *)sinfo->current_syncing; w->obj = ch; w->syncing_i = sinfo->w_i; @@ -459,8 +462,8 @@ static int try_channel(Scheme_Sema *sema, Syncing *syncing, int pos, Scheme_Obje w = w->next; } else { Scheme_Channel_Put *chp = (Scheme_Channel_Put *)w->obj; - - if (!w->syncing->result && !pending_break(w->p)) { + + if (!w->syncing->result && !pending_break(w->p)) { w->picked = 1; w->syncing->result = w->syncing_i + 1; if (w->syncing->disable_break) diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index 70cd9c40cd..83c35d062a 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -3288,9 +3288,7 @@ END_XFORM_SKIP; #endif -#define FALSE_POS_OK_INIT 1 - -static void init_schedule_info(Scheme_Schedule_Info *sinfo, int false_pos_ok, +static void init_schedule_info(Scheme_Schedule_Info *sinfo, Scheme_Thread *false_pos_ok, double sleep_end) { sinfo->false_positive_ok = false_pos_ok; @@ -3647,7 +3645,7 @@ void scheme_thread_block(float sleep_time) if (next->block_check) { Scheme_Ready_Fun_FPC f = (Scheme_Ready_Fun_FPC)next->block_check; Scheme_Schedule_Info sinfo; - init_schedule_info(&sinfo, FALSE_POS_OK_INIT, next->sleep_end); + init_schedule_info(&sinfo, next, next->sleep_end); if (f(next->blocker, &sinfo)) break; next->sleep_end = sinfo.sleep_end; @@ -3795,7 +3793,7 @@ void scheme_thread_block(float sleep_time) if (p->block_check) { Scheme_Ready_Fun_FPC f = (Scheme_Ready_Fun_FPC)p->block_check; Scheme_Schedule_Info sinfo; - init_schedule_info(&sinfo, FALSE_POS_OK_INIT, sleep_end); + init_schedule_info(&sinfo, p, sleep_end); if (f(p->blocker, &sinfo)) { sleep_end = 0; } else {