diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-21 19:53:27 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-21 19:53:27 +0200 |
commit | 3d05e77ca1f743e5b4091c6bfe311460175ed9ae (patch) | |
tree | d17a262c559e389e3adb6171de308800eb9d3426 /sys/src/libc/port | |
parent | 041e4852d258f05fe5f60964a76c99714905774e (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.c | 7 | ||||
-rw-r--r-- | sys/src/libc/port/lock.c | 48 | ||||
-rw-r--r-- | sys/src/libc/port/malloc.acid | 32 | ||||
-rw-r--r-- | sys/src/libc/port/mkfile | 1 | ||||
-rw-r--r-- | sys/src/libc/port/pool.acid | 54 |
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; |