cwfs: use atomic compare and swap to avoid semacquire() syscalls in new queue implementation

This commit is contained in:
cinap_lenrek 2013-08-07 01:32:11 +02:00
parent 2c8f291db2
commit 3663ffeefa

View file

@ -917,11 +917,16 @@ hexdump(void *a, int n)
fprint(2, "%s\n", s1); fprint(2, "%s\n", s1);
} }
extern int cas(long *p, long ov, long nv);
void* void*
fs_recv(Queue *q, int) fs_recv(Queue *q, int)
{ {
void *a; void *a;
long v;
v = q->count;
if(v == 0 || cas(&q->count, v, v-1) == 0)
semacquire(&q->count, 1); semacquire(&q->count, 1);
lock(&q->rl); lock(&q->rl);
a = *q->rp; a = *q->rp;
@ -935,6 +940,10 @@ fs_recv(Queue *q, int)
void void
fs_send(Queue *q, void *a) fs_send(Queue *q, void *a)
{ {
long v;
v = q->avail;
if(v == 0 || cas(&q->avail, v, v-1) == 0)
semacquire(&q->avail, 1); semacquire(&q->avail, 1);
lock(&q->wl); lock(&q->wl);
*q->wp = a; *q->wp = a;