diff options
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h | 107 |
1 files changed, 32 insertions, 75 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h index 4a392e84d7..37842263b6 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h @@ -29,7 +29,8 @@ /* Initializer for compatibility lock. */ -#define LLL_MUTEX_LOCK_INITIALIZER (0) +#define LLL_MUTEX_LOCK_INITIALIZER (0) +#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1) extern int __lll_mutex_lock_wait (int val, int *__futex) attribute_hidden; extern int __lll_mutex_timedlock_wait (int val, int *__futex, @@ -53,7 +54,10 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; 1: mov r1,r15\n\ mov #-1,%0\n\ negc %0,%0"\ - : "=r" (__result) : "r" (&(futex)), "r" (1), "r" (0) \ + : "=r" (__result) \ + : "r" (&(futex)), \ + "r" (LLL_MUTEX_LOCK_INITIALIZER_LOCKED), \ + "r" (LLL_MUTEX_LOCK_INITIALIZER) \ : "r0", "r1", "r2", "t", "memory"); \ __result; }) @@ -63,13 +67,14 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #-8,r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ + tst %0,%0\n\ + bf 1f\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (1) \ - : "r0", "r1", "memory"); \ + : "=&r" (__result) : "r" (1), "r" (__futex) \ + : "r0", "r1", "t", "memory"); \ if (__result) \ __lll_mutex_lock_wait (__result, __futex); }) @@ -81,13 +86,14 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #-8,r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ + tst %0,%0\n\ + bf 1f\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (2) \ - : "r0", "r1", "memory"); \ + : "=&r" (__result) : "r" (2), "r" (__futex) \ + : "r0", "r1", "t", "memory"); \ if (__result) \ __lll_mutex_lock_wait (__result, __futex); }) @@ -97,13 +103,14 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #-8,r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ + tst %0,%0\n\ + bf 1f\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (1) \ - : "r0", "r1", "memory"); \ + : "=&r" (__result) : "r" (1), "r" (__futex) \ + : "r0", "r1", "t", "memory"); \ if (__result) \ __result = __lll_mutex_timedlock_wait (__result, __futex, timeout); \ __result; }) @@ -135,8 +142,8 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden; typedef int lll_lock_t; /* Initializers for lock. */ -#define LLL_LOCK_INITIALIZER (1) -#define LLL_LOCK_INITIALIZER_LOCKED (0) +#define LLL_LOCK_INITIALIZER (0) +#define LLL_LOCK_INITIALIZER_LOCKED (1) # ifdef NEED_SYSCALL_INST_PAD @@ -179,70 +186,20 @@ typedef int lll_lock_t; } while (0) -extern int __lll_lock_wait (int val, int *__futex) attribute_hidden; -extern int __lll_unlock_wake (int *__futex) attribute_hidden; extern int lll_unlock_wake_cb (int *__futex) attribute_hidden; /* The states of a lock are: - 1 - untaken - 0 - taken by one user - <0 - taken by more users */ - - -#define lll_trylock(futex) \ - ({ unsigned char __result; \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - nop\n\ - mov r15,r1\n\ - mov #-8,r15\n\ - 0: mov.l @%1,r2\n\ - cmp/eq r2,%3\n\ - bf 1f\n\ - mov.l %2,@%1\n\ - 1: mov r1,r15\n\ - mov #-1,%0\n\ - negc %0,%0"\ - : "=r" (__result) : "r" (&(futex)), "r" (0), "r" (1) \ - : "r0", "r1", "r2", "t", "memory"); \ - __result; }) - -#define lll_lock(futex) \ - (void) ({ int __result, val, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%2,%0\n\ - add %0,%1\n\ - mov.l %1,@%2\n\ - 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (val) : "r" (__futex), "1" (-1) \ - : "r0", "r1", "memory"); \ - if (val < 0) \ - __lll_lock_wait (__result, __futex); }) + 0 - untaken + 1 - taken by one user + 2 - taken by more users */ -#define lll_unlock(futex) \ - (void) ({ int __result, *__futex = &(futex); \ - __asm __volatile ("\ - .align 2\n\ - mova 1f,r0\n\ - mov r15,r1\n\ - mov #-6,r15\n\ - 0: mov.l @%1,%0\n\ - add #1,%0\n\ - mov.l %0,@%1\n\ - 1: mov r1,r15"\ - : "=&r" (__result) : "r" (__futex) \ - : "r0", "r1", "memory"); \ - if (__result <= 0) \ - __lll_unlock_wake (__futex); }) +#define lll_trylock(futex) lll_mutex_trylock (futex) +#define lll_lock(futex) lll_mutex_lock (futex) +#define lll_unlock(futex) lll_mutex_unlock (futex) #define lll_islocked(futex) \ - (futex <= 0) + (futex != LLL_LOCK_INITIALIZER) /* The kernel notifies a process with uses CLONE_CLEARTID via futex @@ -254,8 +211,8 @@ extern int __lll_wait_tid (int *tid) attribute_hidden; #define lll_wait_tid(tid) \ do { \ __typeof (tid) *__tid = &(tid); \ - if (*__tid != 0) \ - __lll_wait_tid (__tid); \ + while (*__tid != 0) \ + lll_futex_wait (__tid, *__tid); \ } while (0) extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime) |