aboutsummaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/sh
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2007-07-28 20:16:07 +0000
committerUlrich Drepper <drepper@redhat.com>2007-07-28 20:16:07 +0000
commit085a44122074e67d56dca0c4f88f01d450ae82ad (patch)
tree51042f8853e47a41e4bb5f220587e7a70b8ca406 /nptl/sysdeps/unix/sysv/linux/sh
parentae1ad762f0687afb37761085cb6e83305afe4521 (diff)
downloadglibc-085a44122074e67d56dca0c4f88f01d450ae82ad.tar
glibc-085a44122074e67d56dca0c4f88f01d450ae82ad.tar.gz
glibc-085a44122074e67d56dca0c4f88f01d450ae82ad.tar.bz2
glibc-085a44122074e67d56dca0c4f88f01d450ae82ad.zip
* iconvdata/gbk.c (BODY): Make buf and cp char instead of unsigned
char array resp. pointer. * iconvdata/iso-2022-kr.c (BODY): Make buf unsigned char instead of char array. * iconvdata/cns11643.h (cns11643_to_ucs4): Change first argument to const unsigned char **. (ucs4_to_cns11643): Change second argument to unsigned char *. * iconvdata/euc-tw.c (BODY): Change endp type to const unsigned char *. * iconvdata/iso-ir-165.h (ucs4_to_isoir165): Change second argument to unsigned char *. * iconvdata/ibm1008_420.c (LOOP_NEED_FLAGS): Don't define. * iconvdata/iso-2022-cn.c (BODY): Change buf to unsigned char array. * iconvdata/iso-2022-cn-ext.c (BODY): Change buf, tmpbuf, tmp types to unsigned char pointers/arrays instead of char. * iconvdata/jis0201.h (ucs4_to_jisx0201): Change second argument to unsigned char *. * iconvdata/jis0208.h (ucs4_to_jisx0208): Likewise. * iconvdata/jis0212.h: Include assert.h. (ucs4_to_jisx0212): Change second argument to unsigned char *. assert that if cp[0] is not '\0', cp[1] is not '\0' either instead of trying to handle that. * iconvdata/euc-kr.c (euckr_from_ucs4): Initialize also cp[1] to shut up a warning. * iconvdata/euc-jp-ms.c (from_ucs4_lat1, from_ucs4_greek, from_ucs4_cjk, from_ucs4_cjkcpt, from_ucs4_extra): Change type to two dimensional const unsigned char arrays. (BODY): Cast "" to (const unsigned char *) for assignment to cp. Initialize endp to inptr to shut up a warning.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/sh')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h110
1 files changed, 31 insertions, 79 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
index 3092b27642..be47bd752e 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
@@ -40,6 +40,31 @@
#define LLL_SHARED FUTEX_PRIVATE_FLAG
+#if !defined NOT_IN_libc || defined IS_IN_rtld
+/* In libc.so or ld.so all futexes are private. */
+# ifdef __ASSUME_PRIVATE_FUTEX
+# define __lll_private_flag(fl, private) \
+ ((fl) | FUTEX_PRIVATE_FLAG)
+# else
+# define __lll_private_flag(fl, private) \
+ ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex))
+# endif
+#else
+# ifdef __ASSUME_PRIVATE_FUTEX
+# define __lll_private_flag(fl, private) \
+ (((fl) | FUTEX_PRIVATE_FLAG) ^ (private))
+# else
+# define __lll_private_flag(fl, private) \
+ (__builtin_constant_p (private) \
+ ? ((private) == 0 \
+ ? ((fl) | THREAD_GETMEM (THREAD_SELF, header.private_futex)) \
+ : (fl)) \
+ : ((fl) | (((private) ^ FUTEX_PRIVATE_FLAG) \
+ & THREAD_GETMEM (THREAD_SELF, header.private_futex))))
+# endif
+#endif
+
+
/* Initializer for compatibility lock. */
#define LLL_MUTEX_LOCK_INITIALIZER (0)
#define LLL_MUTEX_LOCK_INITIALIZER_LOCKED (1)
@@ -278,7 +303,7 @@ extern int __lll_mutex_unlock_wake (int *__futex) attribute_hidden;
1: mov r1,r15"\
: "=&r" (__ignore) : "r" (__futex), "r" (FUTEX_OWNER_DIED) \
: "r0", "r1", "memory"); \
- lll_futex_wake (__futex, 1, 0); })
+ lll_futex_wake (__futex, 1, LLL_SHARED); })
#define lll_mutex_islocked(futex) \
(futex != 0)
@@ -312,7 +337,8 @@ typedef int lll_lock_t;
int __status; \
register unsigned long __r3 asm ("r3") = SYS_futex; \
register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \
- register unsigned long __r5 asm ("r5") = FUTEX_WAIT; \
+ register unsigned long __r5 asm ("r5") \
+ = __lll_private_flag (FUTEX_WAIT, private); \
register unsigned long __r6 asm ("r6") = (unsigned long) (val); \
register unsigned long __r7 asm ("r7") = (timeout); \
__asm __volatile (SYSCALL_WITH_INST_PAD \
@@ -329,7 +355,8 @@ typedef int lll_lock_t;
int __ignore; \
register unsigned long __r3 asm ("r3") = SYS_futex; \
register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \
- register unsigned long __r5 asm ("r5") = FUTEX_WAKE; \
+ register unsigned long __r5 asm ("r5") \
+ = __lll_private_flag (FUTEX_WAKE, private); \
register unsigned long __r6 asm ("r6") = (unsigned long) (nr); \
register unsigned long __r7 asm ("r7") = 0; \
__asm __volatile (SYSCALL_WITH_INST_PAD \
@@ -340,81 +367,6 @@ typedef int lll_lock_t;
} while (0)
-#define lll_private_futex_wait(futex, val) \
- lll_private_futex_timed_wait (futex, val, NULL)
-
-
-#ifdef __ASSUME_PRIVATE_FUTEX
-# define lll_private_futex_timed_wait(futex, val, timeout) \
- ({ \
- int __status; \
- register unsigned long __r3 asm ("r3") = SYS_futex; \
- register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \
- register unsigned long __r5 asm ("r5") = FUTEX_WAIT | FUTEX_PRIVATE_FLAG; \
- register unsigned long __r6 asm ("r6") = (unsigned long) (val); \
- register unsigned long __r7 asm ("r7") = (timeout); \
- __asm __volatile (SYSCALL_WITH_INST_PAD \
- : "=z" (__status) \
- : "r" (__r3), "r" (__r4), "r" (__r5), \
- "r" (__r6), "r" (__r7) \
- : "memory", "t"); \
- __status; \
- })
-
-
-# define lll_private_futex_wake(futex, nr) \
- do { \
- int __ignore; \
- register unsigned long __r3 asm ("r3") = SYS_futex; \
- register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \
- register unsigned long __r5 asm ("r5") = FUTEX_WAKE | FUTEX_PRIVATE_FLAG; \
- register unsigned long __r6 asm ("r6") = (unsigned long) (nr); \
- register unsigned long __r7 asm ("r7") = 0; \
- __asm __volatile (SYSCALL_WITH_INST_PAD \
- : "=z" (__ignore) \
- : "r" (__r3), "r" (__r4), "r" (__r5), \
- "r" (__r6), "r" (__r7) \
- : "memory", "t"); \
- } while (0)
-
-
-#else
-# define lll_private_futex_timed_wait(futex, val, timeout) \
- ({ \
- int __status; \
- register unsigned long __r3 asm ("r3") = SYS_futex; \
- register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \
- register unsigned long __r5 asm ("r5"); \
- register unsigned long __r6 asm ("r6") = (unsigned long) (val); \
- register unsigned long __r7 asm ("r7") = (timeout); \
- __r5 = THREAD_GETMEM (THREAD_SELF, header.private_futex); \
- __asm __volatile (SYSCALL_WITH_INST_PAD \
- : "=z" (__status) \
- : "r" (__r3), "r" (__r4), "r" (__r5), \
- "r" (__r6), "r" (__r7) \
- : "memory", "t"); \
- __status; \
- })
-
-
-# define lll_private_futex_wake(futex, nr) \
- do { \
- int __ignore; \
- register unsigned long __r3 asm ("r3") = SYS_futex; \
- register unsigned long __r4 asm ("r4") = (unsigned long) (futex); \
- register unsigned long __r5 asm ("r5") = FUTEX_WAKE; \
- register unsigned long __r6 asm ("r6") = (unsigned long) (nr); \
- register unsigned long __r7 asm ("r7") = 0; \
- __r5 |= THREAD_GETMEM (THREAD_SELF, header.private_futex); \
- __asm __volatile (SYSCALL_WITH_INST_PAD \
- : "=z" (__ignore) \
- : "r" (__r3), "r" (__r4), "r" (__r5), \
- "r" (__r6), "r" (__r7) \
- : "memory", "t"); \
- } while (0)
-#endif
-
-
/* The states of a lock are:
0 - untaken
1 - taken by one user
@@ -438,7 +390,7 @@ extern int __lll_wait_tid (int *tid) attribute_hidden;
do { \
__typeof (tid) *__tid = &(tid); \
while (*__tid != 0) \
- lll_futex_wait (__tid, *__tid, 0); \
+ lll_futex_wait (__tid, *__tid, LLL_SHARED); \
} while (0)
extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime)