fix scheduler bug; see plt-scheme 2007-Feb-5 post and reply
svn: r5552
This commit is contained in:
parent
73d0e1ca10
commit
e3a513aa0d
|
@ -385,7 +385,7 @@ typedef struct Scheme_Security_Guard {
|
||||||
|
|
||||||
/* Always allocated on the stack: */
|
/* Always allocated on the stack: */
|
||||||
typedef struct {
|
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 */
|
int potentially_false_positive; /* => returning 1 to swap thread in, but truth may be 0 */
|
||||||
Scheme_Object *current_syncing;
|
Scheme_Object *current_syncing;
|
||||||
double sleep_end;
|
double sleep_end;
|
||||||
|
|
|
@ -430,7 +430,10 @@ static void ext_get_into_line(Scheme_Object *ch, Scheme_Schedule_Info *sinfo)
|
||||||
/* Get into line */
|
/* Get into line */
|
||||||
w = MALLOC_ONE_RT(Scheme_Channel_Syncer);
|
w = MALLOC_ONE_RT(Scheme_Channel_Syncer);
|
||||||
w->so.type = scheme_channel_syncer_type;
|
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->syncing = (Syncing *)sinfo->current_syncing;
|
||||||
w->obj = ch;
|
w->obj = ch;
|
||||||
w->syncing_i = sinfo->w_i;
|
w->syncing_i = sinfo->w_i;
|
||||||
|
@ -460,7 +463,7 @@ static int try_channel(Scheme_Sema *sema, Syncing *syncing, int pos, Scheme_Obje
|
||||||
} else {
|
} else {
|
||||||
Scheme_Channel_Put *chp = (Scheme_Channel_Put *)w->obj;
|
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->picked = 1;
|
||||||
w->syncing->result = w->syncing_i + 1;
|
w->syncing->result = w->syncing_i + 1;
|
||||||
if (w->syncing->disable_break)
|
if (w->syncing->disable_break)
|
||||||
|
|
|
@ -3288,9 +3288,7 @@ END_XFORM_SKIP;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FALSE_POS_OK_INIT 1
|
static void init_schedule_info(Scheme_Schedule_Info *sinfo, Scheme_Thread *false_pos_ok,
|
||||||
|
|
||||||
static void init_schedule_info(Scheme_Schedule_Info *sinfo, int false_pos_ok,
|
|
||||||
double sleep_end)
|
double sleep_end)
|
||||||
{
|
{
|
||||||
sinfo->false_positive_ok = false_pos_ok;
|
sinfo->false_positive_ok = false_pos_ok;
|
||||||
|
@ -3647,7 +3645,7 @@ void scheme_thread_block(float sleep_time)
|
||||||
if (next->block_check) {
|
if (next->block_check) {
|
||||||
Scheme_Ready_Fun_FPC f = (Scheme_Ready_Fun_FPC)next->block_check;
|
Scheme_Ready_Fun_FPC f = (Scheme_Ready_Fun_FPC)next->block_check;
|
||||||
Scheme_Schedule_Info sinfo;
|
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))
|
if (f(next->blocker, &sinfo))
|
||||||
break;
|
break;
|
||||||
next->sleep_end = sinfo.sleep_end;
|
next->sleep_end = sinfo.sleep_end;
|
||||||
|
@ -3795,7 +3793,7 @@ void scheme_thread_block(float sleep_time)
|
||||||
if (p->block_check) {
|
if (p->block_check) {
|
||||||
Scheme_Ready_Fun_FPC f = (Scheme_Ready_Fun_FPC)p->block_check;
|
Scheme_Ready_Fun_FPC f = (Scheme_Ready_Fun_FPC)p->block_check;
|
||||||
Scheme_Schedule_Info sinfo;
|
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)) {
|
if (f(p->blocker, &sinfo)) {
|
||||||
sleep_end = 0;
|
sleep_end = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user