From 275d4a7a0574ebd664ea091741723280e587bd2a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 20 Apr 2011 20:01:29 -0600 Subject: [PATCH] future scheduling fix and tweak - put an atomic action on the atomic queue, even if the future was locally suspended - try local allocation for a multiple-values buffer --- src/racket/src/future.c | 8 +++++--- src/racket/src/jitcommon.c | 9 ++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/racket/src/future.c b/src/racket/src/future.c index 5613faf863..e919a7da98 100644 --- a/src/racket/src/future.c +++ b/src/racket/src/future.c @@ -2354,6 +2354,11 @@ static void future_do_runtimecall(Scheme_Future_Thread_State *fts, future->rt_prim_is_atomic = is_atomic; future->status = WAITING_FOR_PRIM; + if (is_atomic) { + future->next_waiting_atomic = fs->future_waiting_atomic; + fs->future_waiting_atomic = future; + } + if (fts->thread->current_ft) { if (insist_to_suspend) { /* couldn't capture the continuation locally, so ask @@ -2361,9 +2366,6 @@ static void future_do_runtimecall(Scheme_Future_Thread_State *fts, future->next_waiting_lwc = fs->future_waiting_lwc; fs->future_waiting_lwc = future; future->want_lw = 1; - } else if (is_atomic) { - future->next_waiting_atomic = fs->future_waiting_atomic; - fs->future_waiting_atomic = future; } } diff --git a/src/racket/src/jitcommon.c b/src/racket/src/jitcommon.c index de51f496e9..594d1609ab 100644 --- a/src/racket/src/jitcommon.c +++ b/src/racket/src/jitcommon.c @@ -127,7 +127,14 @@ static void allocate_values(int count, Scheme_Thread *p) static void ts_allocate_values(int count, Scheme_Thread *p) XFORM_SKIP_PROC { if (scheme_use_rtcall) { - scheme_rtcall_allocate_values("[allocate_values]", FSRC_OTHER, count, p, allocate_values); + /* try thread-local allocation: */ + Scheme_Object **a; + a = MALLOC_N(Scheme_Object *, count); + if (a) { + p->values_buffer = a; + p->values_buffer_size = count; + } else + scheme_rtcall_allocate_values("[allocate_values]", FSRC_OTHER, count, p, allocate_values); } else allocate_values(count, p); }