summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap/arm
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/ape/lib/ap/arm
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/ape/lib/ap/arm')
-rw-r--r--sys/src/ape/lib/ap/arm/atom.s58
-rw-r--r--sys/src/ape/lib/ap/arm/lock.c37
-rw-r--r--sys/src/ape/lib/ap/arm/mkfile1
3 files changed, 14 insertions, 82 deletions
diff --git a/sys/src/ape/lib/ap/arm/atom.s b/sys/src/ape/lib/ap/arm/atom.s
deleted file mode 100644
index b59a89d90..000000000
--- a/sys/src/ape/lib/ap/arm/atom.s
+++ /dev/null
@@ -1,58 +0,0 @@
-#define CLREX WORD $0xf57ff01f
-#define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12)
-/* `The order of operands is from left to right in dataflow order' - asm man */
-#define STREX(v,a,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
-
-/*
- * int cas(ulong *p, ulong ov, ulong nv);
- */
-
-TEXT cas+0(SB),0,$0 /* r0 holds p */
-TEXT casp+0(SB),0,$0 /* r0 holds p */
- MOVW ov+4(FP), R1
- MOVW nv+8(FP), R2
-spincas:
- LDREX(0,3) /* LDREX 0(R0),R3 */
- CMP.S R3, R1
- BNE fail
- STREX(2,0,4) /* STREX 0(R0),R2,R4 */
- CMP.S $0, R4
- BNE spincas
- MOVW $1, R0
- RET
-fail:
- CLREX
- MOVW $0, R0
- RET
-
-TEXT _xinc(SB), $0 /* void _xinc(long *); */
-TEXT ainc(SB), $0 /* long ainc(long *); */
-spinainc:
- LDREX(0,3) /* LDREX 0(R0),R3 */
- ADD $1,R3
- STREX(3,0,4) /* STREX 0(R0),R3,R4 */
- CMP.S $0, R4
- BNE spinainc
- MOVW R3, R0
- RET
-
-TEXT _xdec(SB), $0 /* long _xdec(long *); */
-TEXT adec(SB), $0 /* long adec(long *); */
-spinadec:
- LDREX(0,3) /* LDREX 0(R0),R3 */
- SUB $1,R3
- STREX(3,0,4) /* STREX 0(R0),R3,R4 */
- CMP.S $0, R4
- BNE spinadec
- MOVW R3, R0
- RET
-
-TEXT loadlinked(SB), $0 /* long loadlinked(long *); */
- LDREX(0,0) /* LDREX 0(R0),R0 */
- RET
-
-TEXT storecond(SB), $0 /* int storecond(long *, long); */
- MOVW ov+4(FP), R3
- STREX(3,0,0) /* STREX 0(R0),R3,R0 */
- RSB $1, R0
- RET
diff --git a/sys/src/ape/lib/ap/arm/lock.c b/sys/src/ape/lib/ap/arm/lock.c
index 65a65df7b..91c0ba233 100644
--- a/sys/src/ape/lib/ap/arm/lock.c
+++ b/sys/src/ape/lib/ap/arm/lock.c
@@ -1,35 +1,26 @@
-#include "../plan9/lib.h"
-#include "../plan9/sys9.h"
#define _LOCK_EXTENSION
+#include "../plan9/sys9.h"
#include <lock.h>
+int tas(int*);
+
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 */
- }
+ while(tas(&lk->val))
+ _SLEEP(0);
}
-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/ape/lib/ap/arm/mkfile b/sys/src/ape/lib/ap/arm/mkfile
index 97d0fa80b..f65e34395 100644
--- a/sys/src/ape/lib/ap/arm/mkfile
+++ b/sys/src/ape/lib/ap/arm/mkfile
@@ -2,7 +2,6 @@ APE=/sys/src/ape
<$APE/config
LIB=/$objtype/lib/ape/libap.a
OFILES=\
- atom.$O\
cycles.$O\
div.$O\
getfcr.$O\