change rb_ractor_queue to ring buffer

This commit is contained in:
tompng 2020-10-07 17:51:19 +09:00 committed by Koichi Sasada
parent c6652f223c
commit e8d03c9a2a
Notes: git 2020-10-12 14:21:24 +09:00
2 changed files with 12 additions and 9 deletions

View File

@ -159,8 +159,9 @@ static void
ractor_queue_mark(struct rb_ractor_queue *rq) ractor_queue_mark(struct rb_ractor_queue *rq)
{ {
for (int i=0; i<rq->cnt; i++) { for (int i=0; i<rq->cnt; i++) {
rb_gc_mark(rq->baskets[i].v); int idx = (rq->start + i) % rq->size;
rb_gc_mark(rq->baskets[i].sender); rb_gc_mark(rq->baskets[idx].v);
rb_gc_mark(rq->baskets[idx].sender);
} }
} }
@ -293,6 +294,7 @@ ractor_queue_setup(struct rb_ractor_queue *rq)
{ {
rq->size = 2; rq->size = 2;
rq->cnt = 0; rq->cnt = 0;
rq->start = 0;
rq->baskets = malloc(sizeof(struct rb_ractor_basket) * rq->size); rq->baskets = malloc(sizeof(struct rb_ractor_basket) * rq->size);
} }
@ -311,12 +313,9 @@ ractor_queue_deq(rb_ractor_t *r, struct rb_ractor_queue *rq, struct rb_ractor_ba
RACTOR_LOCK(r); RACTOR_LOCK(r);
{ {
if (!ractor_queue_empty_p(r, rq)) { if (!ractor_queue_empty_p(r, rq)) {
// TODO: use good Queue data structure *basket = rq->baskets[rq->start];
*basket = rq->baskets[0];
rq->cnt--; rq->cnt--;
for (int i=0; i<rq->cnt; i++) { rq->start = (rq->start + 1) % rq->size;
rq->baskets[i] = rq->baskets[i+1];
}
b = true; b = true;
} }
else { else {
@ -334,10 +333,13 @@ ractor_queue_enq(rb_ractor_t *r, struct rb_ractor_queue *rq, struct rb_ractor_ba
ASSERT_ractor_locking(r); ASSERT_ractor_locking(r);
if (rq->size <= rq->cnt) { if (rq->size <= rq->cnt) {
rq->baskets = realloc(rq->baskets, sizeof(struct rb_ractor_basket) * rq->size * 2);
for (int i=rq->size - rq->start; i<rq->cnt; i++) {
rq->baskets[i + rq->start] = rq->baskets[i + rq->start - rq->size];
}
rq->size *= 2; rq->size *= 2;
rq->baskets = realloc(rq->baskets, sizeof(struct rb_ractor_basket) * rq->size);
} }
rq->baskets[rq->cnt++] = *basket; rq->baskets[(rq->start + rq->cnt++) % rq->size] = *basket;
// fprintf(stderr, "%s %p->cnt:%d\n", __func__, rq, rq->cnt); // fprintf(stderr, "%s %p->cnt:%d\n", __func__, rq, rq->cnt);
} }

View File

@ -25,6 +25,7 @@ struct rb_ractor_basket {
struct rb_ractor_queue { struct rb_ractor_queue {
struct rb_ractor_basket *baskets; struct rb_ractor_basket *baskets;
int start;
int cnt; int cnt;
int size; int size;
}; };