ref: 7754b171a1a965154018acaa87cc5472d5f33972
parent: 6d842bd76e6a3918bc328c629a096f4e730d7391
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Aug 6 21:32:11 EDT 2013
cwfs: use atomic compare and swap to avoid semacquire() syscalls in new queue implementation
--- a/sys/src/cmd/cwfs/sub.c
+++ b/sys/src/cmd/cwfs/sub.c
@@ -917,12 +917,17 @@
fprint(2, "%s\n", s1);
}
+extern int cas(long *p, long ov, long nv);
+
void*
fs_recv(Queue *q, int)
{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);
a = *q->rp;
if(++q->rp >= &q->args[q->size])
@@ -935,7 +940,11 @@
void
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);
*q->wp = a;
if(++q->wp >= &q->args[q->size])
--
⑨