summaryrefslogtreecommitdiff
path: root/sys/src/libc/port
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-09-26 22:24:31 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-09-26 22:24:31 +0200
commitcdc2c30e99f2fb3d65dfbc8ef73efd433a3f1966 (patch)
tree5c3d5a6a42311f09444ca34d09bfebc78e08f5a3 /sys/src/libc/port
parentb4cdfc6c5517390d6be05b2c01e56bacc9e85ea8 (diff)
reverting semaphore lock changes from sources (r41ccd6d221da, rb28756e5ba29)
semaphore locks have much higher overhead than initially presented in the "Semaphores in Plan9" paper. until the reason for it has been found out i will revert the changes.
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, 76 insertions, 66 deletions
diff --git a/sys/src/libc/port/cycles.c b/sys/src/libc/port/cycles.c
deleted file mode 100644
index 9bad3a989..000000000
--- a/sys/src/libc/port/cycles.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#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 213fcd778..af07b9cc7 100644
--- a/sys/src/libc/port/lock.c
+++ b/sys/src/libc/port/lock.c
@@ -2,32 +2,40 @@
#include <libc.h>
void
-lock(Lock *l)
+lock(Lock *lk)
{
- 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 */
+ 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);
}
+ /* take your time */
+ while(_tas(&lk->val))
+ sleep(1000);
}
-void
-unlock(Lock *l)
+int
+canlock(Lock *lk)
{
- if(adec(&l->key) == 0)
- return; /* changed from 1 -> 0: no contention */
- semrelease(&l->sem, 1);
+ if(_tas(&lk->val))
+ return 0;
+ return 1;
}
-int
-canlock(Lock *l)
+void
+unlock(Lock *lk)
{
- 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;
+ lk->val = 0;
}
diff --git a/sys/src/libc/port/malloc.acid b/sys/src/libc/port/malloc.acid
index 5e7519ad4..ac3ca3a9e 100644
--- a/sys/src/libc/port/malloc.acid
+++ b/sys/src/libc/port/malloc.acid
@@ -122,18 +122,16 @@ Profuser = 1;
Profkernel = 2;
Proftime = 3;
Profsample = 4;
-sizeofLock = 8;
+sizeofLock = 4;
aggr Lock
{
- 'D' 0 key;
- 'D' 4 sem;
+ 'D' 0 val;
};
defn
Lock(addr) {
complex Lock addr;
- print(" key ", addr.key, "\n");
- print(" sem ", addr.sem, "\n");
+ print(" val ", addr.val, "\n");
};
sizeofQLp = 12;
@@ -152,13 +150,13 @@ QLp(addr) {
print(" state ", addr.state, "\n");
};
-sizeofQLock = 20;
+sizeofQLock = 16;
aggr QLock
{
Lock 0 lock;
- 'D' 8 locked;
- 'A' QLp 12 $head;
- 'A' QLp 16 $tail;
+ 'D' 4 locked;
+ 'A' QLp 8 $head;
+ 'A' QLp 12 $tail;
};
defn
@@ -172,14 +170,14 @@ QLock(addr) {
print(" $tail ", addr.$tail\X, "\n");
};
-sizeofRWLock = 24;
+sizeofRWLock = 20;
aggr RWLock
{
Lock 0 lock;
- 'D' 8 readers;
- 'D' 12 writer;
- 'A' QLp 16 $head;
- 'A' QLp 20 $tail;
+ 'D' 4 readers;
+ 'D' 8 writer;
+ 'A' QLp 12 $head;
+ 'A' QLp 16 $tail;
};
defn
@@ -440,12 +438,12 @@ Tos(addr) {
};
complex Tos _tos;
-sizeofPrivate = 16;
+sizeofPrivate = 12;
aggr Private
{
Lock 0 lk;
- 'D' 8 pid;
- 'D' 12 printfd;
+ 'D' 4 pid;
+ 'D' 8 printfd;
};
defn
diff --git a/sys/src/libc/port/mkfile b/sys/src/libc/port/mkfile
index 6d1f1c583..dc2d93694 100644
--- a/sys/src/libc/port/mkfile
+++ b/sys/src/libc/port/mkfile
@@ -19,7 +19,6 @@ 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 d4bed5ef7..2ec6f99af 100644
--- a/sys/src/libc/port/pool.acid
+++ b/sys/src/libc/port/pool.acid
@@ -122,18 +122,16 @@ Profuser = 1;
Profkernel = 2;
Proftime = 3;
Profsample = 4;
-sizeofLock = 8;
+sizeofLock = 4;
aggr Lock
{
- 'D' 0 key;
- 'D' 4 sem;
+ 'D' 0 val;
};
defn
Lock(addr) {
complex Lock addr;
- print(" key ", addr.key, "\n");
- print(" sem ", addr.sem, "\n");
+ print(" val ", addr.val, "\n");
};
sizeofQLp = 12;
@@ -152,13 +150,13 @@ QLp(addr) {
print(" state ", addr.state, "\n");
};
-sizeofQLock = 20;
+sizeofQLock = 16;
aggr QLock
{
Lock 0 lock;
- 'D' 8 locked;
- 'A' QLp 12 $head;
- 'A' QLp 16 $tail;
+ 'D' 4 locked;
+ 'A' QLp 8 $head;
+ 'A' QLp 12 $tail;
};
defn
@@ -172,14 +170,14 @@ QLock(addr) {
print(" $tail ", addr.$tail\X, "\n");
};
-sizeofRWLock = 24;
+sizeofRWLock = 20;
aggr RWLock
{
Lock 0 lock;
- 'D' 8 readers;
- 'D' 12 writer;
- 'A' QLp 16 $head;
- 'A' QLp 20 $tail;
+ 'D' 4 readers;
+ 'D' 8 writer;
+ 'A' QLp 12 $head;
+ 'A' QLp 16 $tail;
};
defn
@@ -506,20 +504,34 @@ 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 treesplay:t;
-complex Free treesplay:N;
-complex Free treesplay:l;
-complex Free treesplay:r;
-complex Free treesplay:y;
+complex Free listadd:list;
+complex Free listadd:node;
+complex Free listdelete:list;
+complex Free listdelete:node;
complex Pool pooladd:p;
complex Alloc pooladd:anode;
+complex Free pooladd:lst;
+complex Free pooladd:olst;
complex Free pooladd:node;
-complex Free pooladd:root;
+complex Free pooladd:parent;
complex Pool pooldel:p;
complex Free pooldel:node;
-complex Free pooldel:root;
+complex Free pooldel:lst;
+complex Free pooldel:olst;
+complex Free pooldel:parent;
complex Pool dsize2bsize:p;
complex Pool bsize2asize:p;
complex Pool blockmerge:pool;