make place-channel receives more fair
This commit is contained in:
parent
6c0baa0c1e
commit
9062d27d31
|
@ -3017,11 +3017,16 @@ static void place_async_send(Scheme_Place_Async_Channel *ch, Scheme_Object *uo)
|
||||||
/*wake up possibly sleeping multiple receiver */
|
/*wake up possibly sleeping multiple receiver */
|
||||||
else if (SCHEME_VECTORP(ch->wakeup_signal)) {
|
else if (SCHEME_VECTORP(ch->wakeup_signal)) {
|
||||||
Scheme_Object *v = ch->wakeup_signal;
|
Scheme_Object *v = ch->wakeup_signal;
|
||||||
int i;
|
int i, j, delta;
|
||||||
int size = SCHEME_VEC_SIZE(v);
|
int size = SCHEME_VEC_SIZE(v);
|
||||||
int alive = 0;
|
int alive = 0;
|
||||||
for (i = 0; i < size; i++) {
|
/* Try to be fair by cycling through the available places
|
||||||
|
starting at `delta'. */
|
||||||
|
delta = ch->delta++;
|
||||||
|
if (delta < 0) delta = -delta;
|
||||||
|
for (j = 0; j < size; j++) {
|
||||||
Scheme_Place_Object *o3;
|
Scheme_Place_Object *o3;
|
||||||
|
i = (j + delta) % size;
|
||||||
o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i];
|
o3 = (Scheme_Place_Object *)SCHEME_VEC_ELS(v)[i];
|
||||||
if (o3) {
|
if (o3) {
|
||||||
int refcount = 0;
|
int refcount = 0;
|
||||||
|
@ -3119,13 +3124,17 @@ static void register_place_object_with_channel(Scheme_Place_Async_Channel *ch, S
|
||||||
int i = 0;
|
int i = 0;
|
||||||
Scheme_Object *v = ch->wakeup_signal;
|
Scheme_Object *v = ch->wakeup_signal;
|
||||||
int size = SCHEME_VEC_SIZE(v);
|
int size = SCHEME_VEC_SIZE(v);
|
||||||
/* look for unused slot in wakeup vector */
|
/* already registered? */
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
Scheme_Object *vo = SCHEME_VEC_ELS(v)[i];
|
Scheme_Object *vo = SCHEME_VEC_ELS(v)[i];
|
||||||
if (vo == o) {
|
if (vo == o) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (!vo) {
|
}
|
||||||
|
/* look for unused slot in wakeup vector */
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
Scheme_Object *vo = SCHEME_VEC_ELS(v)[i];
|
||||||
|
if (!vo) {
|
||||||
place_object_inc_refcount(o);
|
place_object_inc_refcount(o);
|
||||||
SCHEME_VEC_ELS(v)[i] = o;
|
SCHEME_VEC_ELS(v)[i] = o;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -3906,6 +3906,7 @@ typedef struct Scheme_Place_Async_Channel {
|
||||||
int out;
|
int out;
|
||||||
int count;
|
int count;
|
||||||
int size;
|
int size;
|
||||||
|
int delta;
|
||||||
#if defined(MZ_USE_PLACES)
|
#if defined(MZ_USE_PLACES)
|
||||||
mzrt_mutex *lock;
|
mzrt_mutex *lock;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user