summaryrefslogtreecommitdiff
path: root/sys/src/libc/port
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-09-21 19:53:27 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-09-21 19:53:27 +0200
commit3d05e77ca1f743e5b4091c6bfe311460175ed9ae (patch)
treed17a262c559e389e3adb6171de308800eb9d3426 /sys/src/libc/port
parent041e4852d258f05fe5f60964a76c99714905774e (diff)
libc: change tas/sleep locks to cas/semacquire/semrelease locks (from sources)
spinlocks have been changed to use the new semacquire/semrelease syscalls in combination with atomic compare and swap operations.
Diffstat (limited to 'sys/src/libc/port')
-rw-r--r--sys/src/libc/port/cycles.c7
-rw-r--r--sys/src/libc/port/lock.c48
-rw-r--r--sys/src/libc/port/malloc.acid32
-rw-r--r--sys/src/libc/port/mkfile1
-rw-r--r--sys/src/libc/port/pool.acid54
5 files changed, 66 insertions, 76 deletions
diff --git a/sys/src/libc/port/cycles.c b/sys/src/libc/port/cycles.c
new file mode 100644
index 000000000..9bad3a989
--- /dev/null
+++ b/sys/src/libc/port/cycles.c
@@ -0,0 +1,7 @@
+#include <u.h>
+#include <libc.h>
+
+void cycles(uvlong*u)
+{
+ *u = 0LL;
+}
diff --git a/sys/src/libc/port/lock.c b/sys/src/libc/port/lock.c
index af07b9cc7..213fcd778 100644
--- a/sys/src/libc/port/lock.c
+++ b/sys/src/libc/port/lock.c
@@ -2,40 +2,32 @@
#include <libc.h>
void
-lock(Lock *lk)
+lock(Lock *l)
{
- int i;
-
- /* once fast */
- if(!_tas(&lk->val))
- return;
- /* a thousand times pretty fast */
- for(i=0; i<1000; i++){
- if(!_tas(&lk->val))
- return;
- sleep(0);
- }
- /* now nice and slow */
- for(i=0; i<1000; i++){
- if(!_tas(&lk->val))
- return;
- sleep(100);
+ if(ainc(&l->key) == 1)
+ return; /* changed from 0 -> 1: we hold lock */
+ /* otherwise wait in kernel */
+ while(semacquire(&l->sem, 1) < 0){
+ /* interrupted; try again */
}
- /* take your time */
- while(_tas(&lk->val))
- sleep(1000);
}
-int
-canlock(Lock *lk)
+void
+unlock(Lock *l)
{
- if(_tas(&lk->val))
- return 0;
- return 1;
+ if(adec(&l->key) == 0)
+ return; /* changed from 1 -> 0: no contention */
+ semrelease(&l->sem, 1);
}
-void
-unlock(Lock *lk)
+int
+canlock(Lock *l)
{
- lk->val = 0;
+ if(ainc(&l->key) == 1)
+ return 1; /* changed from 0 -> 1: success */
+ /* Undo increment (but don't miss wakeup) */
+ if(adec(&l->key) == 0)
+ return 0; /* changed from 1 -> 0: no contention */
+ semrelease(&l->sem, 1);
+ return 0;
}
diff --git a/sys/src/libc/port/malloc.acid b/sys/src/libc/port/malloc.acid
index ac3ca3a9e..5e7519ad4 100644
--- a/sys/src/libc/port/malloc.acid
+++ b/sys/src/libc/port/malloc.acid
@@ -122,16 +122,18 @@ Profuser = 1;
Profkernel = 2;
Proftime = 3;
Profsample = 4;
-sizeofLock = 4;
+sizeofLock = 8;
aggr Lock
{
- 'D' 0 val;
+ 'D' 0 key;
+ 'D' 4 sem;
};
defn
Lock(addr) {
complex Lock addr;
- print(" val ", addr.val, "\n");
+ print(" key ", addr.key, "\n");
+ print(" sem ", addr.sem, "\n");
};
sizeofQLp = 12;
@@ -150,13 +152,13 @@ QLp(addr) {
print(" state ", addr.state, "\n");
};
-sizeofQLock = 16;
+sizeofQLock = 20;
aggr QLock
{
Lock 0 lock;
- 'D' 4 locked;
- 'A' QLp 8 $head;
- 'A' QLp 12 $tail;
+ 'D' 8 locked;
+ 'A' QLp 12 $head;
+ 'A' QLp 16 $tail;
};
defn
@@ -170,14 +172,14 @@ QLock(addr) {
print(" $tail ", addr.$tail\X, "\n");
};
-sizeofRWLock = 20;
+sizeofRWLock = 24;
aggr RWLock
{
Lock 0 lock;
- 'D' 4 readers;
- 'D' 8 writer;
- 'A' QLp 12 $head;
- 'A' QLp 16 $tail;
+ 'D' 8 readers;
+ 'D' 12 writer;
+ 'A' QLp 16 $head;
+ 'A' QLp 20 $tail;
};
defn
@@ -438,12 +440,12 @@ Tos(addr) {
};
complex Tos _tos;
-sizeofPrivate = 12;
+sizeofPrivate = 16;
aggr Private
{
Lock 0 lk;
- 'D' 4 pid;
- 'D' 8 printfd;
+ 'D' 8 pid;
+ 'D' 12 printfd;
};
defn
diff --git a/sys/src/libc/port/mkfile b/sys/src/libc/port/mkfile
index dc2d93694..6d1f1c583 100644
--- a/sys/src/libc/port/mkfile
+++ b/sys/src/libc/port/mkfile
@@ -19,6 +19,7 @@ CFILES=\
cleanname.c\
crypt.c\
ctype.c\
+ cycles.c\
encodefmt.c\
execl.c\
exp.c\
diff --git a/sys/src/libc/port/pool.acid b/sys/src/libc/port/pool.acid
index 2ec6f99af..d4bed5ef7 100644
--- a/sys/src/libc/port/pool.acid
+++ b/sys/src/libc/port/pool.acid
@@ -122,16 +122,18 @@ Profuser = 1;
Profkernel = 2;
Proftime = 3;
Profsample = 4;
-sizeofLock = 4;
+sizeofLock = 8;
aggr Lock
{
- 'D' 0 val;
+ 'D' 0 key;
+ 'D' 4 sem;
};
defn
Lock(addr) {
complex Lock addr;
- print(" val ", addr.val, "\n");
+ print(" key ", addr.key, "\n");
+ print(" sem ", addr.sem, "\n");
};
sizeofQLp = 12;
@@ -150,13 +152,13 @@ QLp(addr) {
print(" state ", addr.state, "\n");
};
-sizeofQLock = 16;
+sizeofQLock = 20;
aggr QLock
{
Lock 0 lock;
- 'D' 4 locked;
- 'A' QLp 8 $head;
- 'A' QLp 12 $tail;
+ 'D' 8 locked;
+ 'A' QLp 12 $head;
+ 'A' QLp 16 $tail;
};
defn
@@ -170,14 +172,14 @@ QLock(addr) {
print(" $tail ", addr.$tail\X, "\n");
};
-sizeofRWLock = 20;
+sizeofRWLock = 24;
aggr RWLock
{
Lock 0 lock;
- 'D' 4 readers;
- 'D' 8 writer;
- 'A' QLp 12 $head;
- 'A' QLp 16 $tail;
+ 'D' 8 readers;
+ 'D' 12 writer;
+ 'A' QLp 16 $head;
+ 'A' QLp 20 $tail;
};
defn
@@ -504,34 +506,20 @@ MINBLOCKSIZE = 32;
complex Free checklist:t;
complex Free checklist:q;
complex Free checktree:t;
-complex Free ltreewalk:t;
-complex Free ltreewalk:f;
-complex Free treeinsert:tree;
-complex Free treeinsert:node;
-complex Free treeinsert:loc;
-complex Free treeinsert:repl;
-complex Free treedelete:tree;
-complex Free treedelete:node;
-complex Free treedelete:loc;
-complex Free treedelete:lsucc;
-complex Free treedelete:succ;
complex Free treelookupgt:t;
complex Free treelookupgt:lastgood;
-complex Free listadd:list;
-complex Free listadd:node;
-complex Free listdelete:list;
-complex Free listdelete:node;
+complex Free treesplay:t;
+complex Free treesplay:N;
+complex Free treesplay:l;
+complex Free treesplay:r;
+complex Free treesplay:y;
complex Pool pooladd:p;
complex Alloc pooladd:anode;
-complex Free pooladd:lst;
-complex Free pooladd:olst;
complex Free pooladd:node;
-complex Free pooladd:parent;
+complex Free pooladd:root;
complex Pool pooldel:p;
complex Free pooldel:node;
-complex Free pooldel:lst;
-complex Free pooldel:olst;
-complex Free pooldel:parent;
+complex Free pooldel:root;
complex Pool dsize2bsize:p;
complex Pool bsize2asize:p;
complex Pool blockmerge:pool;