git: 9front

Download patch

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])
--