summaryrefslogtreecommitdiff
path: root/nptl
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-06-01 18:53:04 +0000
committerUlrich Drepper <drepper@redhat.com>2004-06-01 18:53:04 +0000
commitfbf86ddab2cd53c0a63173c1eb8b39c2b970fb8d (patch)
tree233df1d9ff53bdaa0453c2e3f5d8f5aea4f0f90b /nptl
parent016deb4c4fb9c52abe842bfc468af2ea38691dbc (diff)
Update.
2004-05-10 Jakub Jelinek <jakub@redhat.com> * sysdeps/posix/sysconf.c (__sysconf) <cases _SC_REALTIME_SIGNALS, _SC_PRIORITY_SCHEDULING, _SC_TIMERS, _SC_ASYNCHRONOUS_IO, _SC_PRIORITIZED_IO, _SC_SYNCHRONIZED_IO, _SC_FSYNC, _SC_MAPPED_FILES, _SC_MEMLOCK, _SC_MEMLOCK_RANGE, _SC_MEMORY_PROTECTION, _SC_MESSAGE_PASSING, _SC_SEMAPHORES, _SC_SHARED_MEMORY_OBJECTS, _SC_THREADS, _SC_THREAD_SAFE_FUNCTIONS, _SC_THREAD_ATTR_STACKADDR, _SC_THREAD_ATTR_STACKSIZE, _SC_THREAD_PRIORITY_SCHEDULING, _SC_THREAD_PRIO_INHERIT, _SC_THREAD_PRIO_PROTECT, _SC_THREAD_PROCESS_SHARED>: Return _POSIX_* value instead of 1. * sysdeps/unix/sysv/linux/sysconf.c (__sysconf) <case _SC_MONOTONIC_CLOCK>: Return _POSIX_VERSION instead of 1. 2004-05-07 Jeroen Dekkers <jeroen@dekkers.cx> * sysdeps/mach/hurd/i386/Makefile (CFLAGS-init-first.c): Add -momit-leaf-frame-pointer. * inet/test-ifaddrs.c (addr_string): Surround AF_PACKET case with #ifdef AF_PACKET. * sysdeps/mach/hurd/getcwd.c (_hurd_canonicalize_directory_name_intern): Only realloc when size is <= 0. * sysdeps/mach/hurd/mmap.c (__mmap): Fail when addr or offset isn't page aligned. * sysdeps/mach/hurd/spawni.c (EXPAND_DTABLE): Set dtablesize to new size. * sysdeps/mach/hurd/Versions (GLIBC_PRIVATE): Add __libc_read, __libc_write and __libc_lseek64.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog17
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h1
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S37
-rw-r--r--nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S22
5 files changed, 78 insertions, 4 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 9164affc9d..071e7048cc 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,20 @@
+2004-06-01 Kaz Kojima <kkojima@rr.iij4u.or.jp>
+
+ * sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h (pthread_cond_t):
+ Add __broadcast_seq field.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S: Mark
+ all waiters as woken with woken_seq and bump broadcast counter.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S: Use new
+ __broadcast_seq. Increment __woken_seq correctly when cleanuped.
+ * sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S: Likewise.
+ Comment typo fixes. Avoid returning -ETIMEDOUT.
+
+2004-06-01 Ulrich Drepper <drepper@redhat.com>
+
+ * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
+ (__condvar_tw_cleanup): Fix access to saved broadcast_seq value.
+ Reported by Kaz Kojima.
+
2004-05-25 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/aio_misc.h: New file.
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h b/nptl/sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h
index 7d05908778..2a4c95a083 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h
+++ b/nptl/sysdeps/unix/sysv/linux/sh/bits/pthreadtypes.h
@@ -82,6 +82,7 @@ typedef union
unsigned long long int __wakeup_seq;
unsigned long long int __woken_seq;
void *__mutex;
+ unsigned int __broadcast_seq;
} __data;
char __size[__SIZEOF_PTHREAD_COND_T];
long long int __align;
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
index a433ba3c37..4277c9a111 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_broadcast.S
@@ -67,6 +67,11 @@ __pthread_cond_broadcast:
woken up. */
mov.l r1, @(wakeup_seq,r8)
mov.l r0, @(wakeup_seq+4,r8)
+ mov.l r1, @(woken_seq,r8)
+ mov.l r0, @(woken_seq+4,r8)
+ mov.l @(broadcast_seq,r8), r2
+ add #1, r2
+ mov.l r2, @(broadcast_seq,r8)
/* Get the address of the mutex used. */
mov.l @(dep_mutex,r8), r9
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
index ab3bbe035a..b9d8f5b920 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_timedwait.S
@@ -114,6 +114,8 @@ __pthread_cond_timedwait:
/* Get and store current wakeup_seq value. */
mov.l @(wakeup_seq,r8), r10
mov.l @(wakeup_seq+4,r8), r11
+ mov.l @(broadcast_seq,r8), r0
+ mov.l r0, @(4,r15)
8:
/* Get current time. */
@@ -140,8 +142,10 @@ __pthread_cond_timedwait:
add r1, r3
add #-1, r2
12:
+ mov #-ETIMEDOUT, r1
+ mov.l r1, @(12,r15)
cmp/pz r2
- bf 13f /* Time is already up. */
+ bf 6f /* Time is already up. */
/* Store relative timeout. */
mov.l r2, @(16,r15)
@@ -193,6 +197,11 @@ __pthread_cond_timedwait:
#endif
bf 5f
6:
+ mov.l @(broadcast_seq,r8), r0
+ mov.l @(4,r15), r1
+ cmp/eq r0, r1
+ bf 23f
+
mov.l @(woken_seq,r8), r0
mov.l @(woken_seq+4,r8), r1
@@ -212,7 +221,7 @@ __pthread_cond_timedwait:
mov.l @(12,r15),r0
cmp/eq #-ETIMEDOUT, r0
bf 8b
-13:
+
mov #1, r2
mov #0, r3
@@ -227,6 +236,11 @@ __pthread_cond_timedwait:
bra 14f
mov.l r0, @(24,r15)
+23:
+ mov #0, r0
+ bra 24f
+ mov.l r0, @(24,r15)
+
9:
mov #0, r0
mov.l r0, @(24,r15)
@@ -242,6 +256,7 @@ __pthread_cond_timedwait:
mov.l r0,@(woken_seq,r8)
mov.l r1,@(woken_seq+4,r8)
+24:
#if cond_lock != 0
DEC (@(cond_lock,r8), r2)
#else
@@ -301,7 +316,7 @@ __pthread_cond_timedwait:
nop
3:
- /* Unlock in loop requires waekup. */
+ /* Unlock in loop requires wakeup. */
mov r8, r4
#if cond_lock != 0
add #cond_lock, r4
@@ -327,7 +342,7 @@ __pthread_cond_timedwait:
nop
10:
- /* Unlock after loop requires waekup. */
+ /* Unlock after loop requires wakeup. */
mov r8, r4
#if cond_lock != 0
add #cond_lock, r4
@@ -403,6 +418,11 @@ __condvar_tw_cleanup:
.Lmwait5b:
1:
+ mov.l @(broadcast_seq,r8), r0
+ mov.l @(4,r15), r1
+ cmp/eq r0, r1
+ bf 3f
+
mov #1, r2
mov #0, r3
@@ -414,6 +434,15 @@ __condvar_tw_cleanup:
mov.l r0,@(wakeup_seq,r8)
mov.l r1,@(wakeup_seq+4,r8)
+ clrt
+ mov.l @(woken_seq,r8),r0
+ mov.l @(woken_seq+4,r8),r1
+ addc r2, r0
+ addc r3, r1
+ mov.l r0,@(woken_seq,r8)
+ mov.l r1,@(woken_seq+4,r8)
+
+3:
#if cond_lock != 0
DEC (@(cond_lock,r8), r2)
#else
diff --git a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
index c93a304363..6068de8f42 100644
--- a/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
+++ b/nptl/sysdeps/unix/sysv/linux/sh/pthread_cond_wait.S
@@ -108,6 +108,8 @@ __pthread_cond_wait:
/* Get and store current wakeup_seq value. */
mov.l @(wakeup_seq,r8), r10
mov.l @(wakeup_seq+4,r8), r11
+ mov.l @(broadcast_seq,r8), r0
+ mov.l r0, @(4,r15)
8:
/* Unlock. */
@@ -152,6 +154,11 @@ __pthread_cond_wait:
#endif
bf 5f
6:
+ mov.l @(broadcast_seq,r8), r0
+ mov.l @(4,r15), r1
+ cmp/eq r0, r1
+ bf 16f
+
mov.l @(woken_seq,r8), r0
mov.l @(woken_seq+4,r8), r1
@@ -179,6 +186,7 @@ __pthread_cond_wait:
mov.l r0,@(woken_seq,r8)
mov.l r1,@(woken_seq+4,r8)
+16:
#if cond_lock != 0
DEC (@(cond_lock,r8), r2)
#else
@@ -330,6 +338,11 @@ __condvar_w_cleanup:
.Lmwait3b:
1:
+ mov.l @(broadcast_seq,r8), r0
+ mov.l @(4,r15), r1
+ cmp/eq r0, r1
+ bf 3f
+
mov #1, r2
mov #0, r3
@@ -341,6 +354,15 @@ __condvar_w_cleanup:
mov.l r0,@(wakeup_seq,r8)
mov.l r1,@(wakeup_seq+4,r8)
+ clrt
+ mov.l @(woken_seq,r8),r0
+ mov.l @(woken_seq+4,r8),r1
+ addc r2, r0
+ addc r3, r1
+ mov.l r0,@(woken_seq,r8)
+ mov.l r1,@(woken_seq+4,r8)
+
+3:
#if cond_lock != 0
DEC (@(cond_lock,r8), r2)
#else