cwfs: use atomic compare and swap to avoid semacquire() syscalls in new queue implementation
This commit is contained in:
parent
2c8f291db2
commit
3663ffeefa
1 changed files with 11 additions and 2 deletions
|
@ -917,12 +917,17 @@ 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;
|
||||||
|
|
||||||
semacquire(&q->count, 1);
|
v = q->count;
|
||||||
|
if(v == 0 || cas(&q->count, v, v-1) == 0)
|
||||||
|
semacquire(&q->count, 1);
|
||||||
lock(&q->rl);
|
lock(&q->rl);
|
||||||
a = *q->rp;
|
a = *q->rp;
|
||||||
if(++q->rp >= &q->args[q->size])
|
if(++q->rp >= &q->args[q->size])
|
||||||
|
@ -935,7 +940,11 @@ fs_recv(Queue *q, int)
|
||||||
void
|
void
|
||||||
fs_send(Queue *q, void *a)
|
fs_send(Queue *q, void *a)
|
||||||
{
|
{
|
||||||
semacquire(&q->avail, 1);
|
long v;
|
||||||
|
|
||||||
|
v = q->avail;
|
||||||
|
if(v == 0 || cas(&q->avail, v, v-1) == 0)
|
||||||
|
semacquire(&q->avail, 1);
|
||||||
lock(&q->wl);
|
lock(&q->wl);
|
||||||
*q->wp = a;
|
*q->wp = a;
|
||||||
if(++q->wp >= &q->args[q->size])
|
if(++q->wp >= &q->args[q->size])
|
||||||
|
|
Loading…
Reference in a new issue