mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-31 15:01:09 +00:00
[BZ #163]
Update. 2004-05-18 Petter Reinholdtsen <pere@hungry.com> * locales/sl_SI [LC_TIME]: Correct d_fmt date format from '22.06.2003' to '22. 06. 2003'. Change requested from Aleks Reinhardt, and approved by the locale author Borka Jerman-Blazic. [BZ #163]
This commit is contained in:
parent
d40eb37aad
commit
893a351195
@ -1,3 +1,10 @@
|
|||||||
|
2004-05-18 Petter Reinholdtsen <pere@hungry.com>
|
||||||
|
|
||||||
|
* locales/sl_SI [LC_TIME]: Correct d_fmt date format from
|
||||||
|
'22.06.2003' to '22. 06. 2003'. Change requested from Aleks
|
||||||
|
Reinhardt, and approved by the locale author Borka
|
||||||
|
Jerman-Blazic. [BZ #163]
|
||||||
|
|
||||||
2004-05-17 Ulrich Drepper <drepper@redhat.com>
|
2004-05-17 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* SUPPORTED (SUPPORTED-LOCALES): Remove sr_YU locales.
|
* SUPPORTED (SUPPORTED-LOCALES): Remove sr_YU locales.
|
||||||
|
@ -2176,7 +2176,7 @@ mon "<U006A><U0061><U006E><U0075><U0061><U0072>";/
|
|||||||
"<U006E><U006F><U0076><U0065><U006D><U0062><U0065><U0072>";/
|
"<U006E><U006F><U0076><U0065><U006D><U0062><U0065><U0072>";/
|
||||||
"<U0064><U0065><U0063><U0065><U006D><U0062><U0065><U0072>"
|
"<U0064><U0065><U0063><U0065><U006D><U0062><U0065><U0072>"
|
||||||
d_t_fmt "<U0025><U0061><U0020><U0025><U0064><U0020><U0025><U0062><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>"
|
d_t_fmt "<U0025><U0061><U0020><U0025><U0064><U0020><U0025><U0062><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>"
|
||||||
d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059>"
|
d_fmt "<U0025><U0064><U002E><U0020><U0025><U006D><U002E><U0020><U0025><U0059>"
|
||||||
t_fmt "<U0025><U0054>"
|
t_fmt "<U0025><U0054>"
|
||||||
am_pm "";""
|
am_pm "";""
|
||||||
t_fmt_ampm ""
|
t_fmt_ampm ""
|
||||||
|
@ -30,7 +30,7 @@ sub usage {
|
|||||||
print " --help print this help, then exit\n";
|
print " --help print this help, then exit\n";
|
||||||
print " --version print version number, then exit\n";
|
print " --version print version number, then exit\n";
|
||||||
print "\n";
|
print "\n";
|
||||||
print "For bug reporting instructions, please see:\n"
|
print "For bug reporting instructions, please see:\n";
|
||||||
print "<http://www.gnu.org/software/libc/bugs.html>.\n";
|
print "<http://www.gnu.org/software/libc/bugs.html>.\n";
|
||||||
exit 0;
|
exit 0;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,48 @@
|
|||||||
|
2004-05-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* Makefile (.NOTPARALLEL): Only serialize make check/xcheck, not
|
||||||
|
compilation.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S
|
||||||
|
(__pthread_cond_timedwait): Avoid returning -ETIMEDOUT.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/bits/pthreadtypes.h
|
||||||
|
(pthread_cond_t): Add __data.__broadcast_seq field.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S
|
||||||
|
(FRAME_SIZE): Define.
|
||||||
|
(__pthread_cond_timedwait): Use it. Store/check broadcast_seq.
|
||||||
|
Comment typo fixes.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S (FRAME_SIZE):
|
||||||
|
Define.
|
||||||
|
(__pthread_cond_wait): Use it. Store/check broadcast_seq. Comment
|
||||||
|
typo fixes.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_broadcast.S
|
||||||
|
(__pthread_cond_broadcast): Increment broadcast_seq. Comment typo
|
||||||
|
fixes.
|
||||||
|
|
||||||
|
2004-05-18 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/lowlevelcond.sym: Add broadcast_seq entry.
|
||||||
|
* sysdeps/unix/sysv/linux/alpha/bits/pthreadtypes.h (pthread_cond_t):
|
||||||
|
Add __broadcast_seq field.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/bits/pthreadtypes.h: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Mark
|
||||||
|
all waiters as woken with woken_seq and bump broadcast counter.
|
||||||
|
* sysdeps/pthread/pthread_cond_broadcast.c: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Use new
|
||||||
|
__broadcast_seq field.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_timedwait.S: Likewise.
|
||||||
|
* sysdeps/pthread/pthread_cond_wait.c: Likewise.
|
||||||
|
* sysdeps/pthread/pthread_cond_timedwait.c: Likewise.
|
||||||
|
* pthread_cond_init.c: Initialize __broadcast_seq field.
|
||||||
|
* Makefile (tests): Add tst-cond17 and tst-cond18.
|
||||||
|
Add .NOTPARALLEL goal.
|
||||||
|
* tst-cond16.c: New file. From Jakub.
|
||||||
|
* tst-cond17.c: New file. From Jakub.
|
||||||
|
* tst-cond18.c: New file. From Jakub.
|
||||||
|
|
||||||
2004-05-16 Ulrich Drepper <drepper@redhat.com>
|
2004-05-16 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Correct some
|
* sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Correct some
|
||||||
|
@ -23,16 +23,30 @@ struct pthread_cond_t {
|
|||||||
|
|
||||||
sequence number of last woken thread.
|
sequence number of last woken thread.
|
||||||
|
|
||||||
|
uint32_t broadcast_seq;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct cv_data {
|
||||||
|
|
||||||
|
pthread_cond_t *cv;
|
||||||
|
|
||||||
|
uint32_t bc_seq
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cleanup_handler(cv)
|
cleanup_handler(cv_data)
|
||||||
{
|
{
|
||||||
|
cv = cv_data->cv;
|
||||||
lll_lock(cv->lock);
|
lll_lock(cv->lock);
|
||||||
|
|
||||||
++cv->wakeup_seq;
|
if (cv_data->bc_seq == cv->broadcast_seq) {
|
||||||
++cv->woken_seq;
|
++cv->wakeup_seq;
|
||||||
|
++cv->woken_seq;
|
||||||
|
}
|
||||||
|
|
||||||
/* make sure no signal gets lost. */
|
/* make sure no signal gets lost. */
|
||||||
FUTEX_WAKE(cv->wakeup_seq, ALL);
|
FUTEX_WAKE(cv->wakeup_seq, ALL);
|
||||||
@ -50,12 +64,14 @@ cond_timedwait(cv, mutex, timeout):
|
|||||||
|
|
||||||
++cv->total_seq;
|
++cv->total_seq;
|
||||||
val = seq = cv->wakeup_seq;
|
val = seq = cv->wakeup_seq;
|
||||||
|
cv_data.bc = cv->broadcast_seq;
|
||||||
|
cv_data.cv = cv;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
lll_unlock(cv->lock);
|
lll_unlock(cv->lock);
|
||||||
|
|
||||||
enable_async
|
enable_async(&cv_data);
|
||||||
|
|
||||||
ret = FUTEX_WAIT(cv->wakeup_seq, val, timeout);
|
ret = FUTEX_WAIT(cv->wakeup_seq, val, timeout);
|
||||||
|
|
||||||
@ -63,6 +79,9 @@ cond_timedwait(cv, mutex, timeout):
|
|||||||
|
|
||||||
lll_lock(cv->lock);
|
lll_lock(cv->lock);
|
||||||
|
|
||||||
|
if (bc != cv->broadcast_seq)
|
||||||
|
goto bc_out;
|
||||||
|
|
||||||
val = cv->wakeup_seq;
|
val = cv->wakeup_seq;
|
||||||
|
|
||||||
if (val != seq && cv->woken_seq != val) {
|
if (val != seq && cv->woken_seq != val) {
|
||||||
@ -78,6 +97,7 @@ cond_timedwait(cv, mutex, timeout):
|
|||||||
|
|
||||||
++cv->woken_seq;
|
++cv->woken_seq;
|
||||||
|
|
||||||
|
bc_out:
|
||||||
lll_unlock(cv->lock);
|
lll_unlock(cv->lock);
|
||||||
|
|
||||||
cleanup_pop
|
cleanup_pop
|
||||||
@ -105,6 +125,8 @@ cond_broadcast(cv)
|
|||||||
|
|
||||||
if (cv->total_seq > cv->wakeup_seq) {
|
if (cv->total_seq > cv->wakeup_seq) {
|
||||||
cv->wakeup_seq = cv->total_seq;
|
cv->wakeup_seq = cv->total_seq;
|
||||||
|
cv->woken_seq = cv->total_seq;
|
||||||
|
++cv->broadcast_seq;
|
||||||
FUTEX_WAKE(cv->wakeup_seq, ALL);
|
FUTEX_WAKE(cv->wakeup_seq, ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 \
|
|||||||
tst-spin1 tst-spin2 tst-spin3 \
|
tst-spin1 tst-spin2 tst-spin3 \
|
||||||
tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \
|
tst-cond1 tst-cond2 tst-cond3 tst-cond4 tst-cond5 tst-cond6 tst-cond7 \
|
||||||
tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \
|
tst-cond8 tst-cond9 tst-cond10 tst-cond11 tst-cond12 tst-cond13 \
|
||||||
tst-cond14 tst-cond15 \
|
tst-cond14 tst-cond15 tst-cond17 tst-cond18 \
|
||||||
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
|
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
|
||||||
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
|
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
|
||||||
tst-rwlock11 tst-rwlock12 tst-rwlock13 \
|
tst-rwlock11 tst-rwlock12 tst-rwlock13 \
|
||||||
@ -576,3 +576,8 @@ tst-exec4-ARGS = $(built-program-cmd)
|
|||||||
$(objpfx)tst-execstack: $(libdl)
|
$(objpfx)tst-execstack: $(libdl)
|
||||||
$(objpfx)tst-execstack.out: $(objpfx)tst-execstack-mod.so
|
$(objpfx)tst-execstack.out: $(objpfx)tst-execstack-mod.so
|
||||||
LDFLAGS-tst-execstack = -Wl,-z,noexecstack
|
LDFLAGS-tst-execstack = -Wl,-z,noexecstack
|
||||||
|
|
||||||
|
# The tests here better do not run in parallel
|
||||||
|
ifneq ($(filter %tests,$(MAKECMDGOALS)),)
|
||||||
|
.NOTPARALLEL:
|
||||||
|
endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -38,6 +38,7 @@ __pthread_cond_init (cond, cond_attr)
|
|||||||
cond->__data.__woken_seq = 0;
|
cond->__data.__woken_seq = 0;
|
||||||
cond->__data.__mutex = (icond_attr == NULL || (icond_attr->value & 1) == 0
|
cond->__data.__mutex = (icond_attr == NULL || (icond_attr->value & 1) == 0
|
||||||
? NULL : (void *) ~0l);
|
? NULL : (void *) ~0l);
|
||||||
|
cond->__data.__broadcast_seq = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
||||||
|
|
||||||
@ -40,6 +40,9 @@ __pthread_cond_broadcast (cond)
|
|||||||
{
|
{
|
||||||
/* Yes. Mark them all as woken. */
|
/* Yes. Mark them all as woken. */
|
||||||
cond->__data.__wakeup_seq = cond->__data.__total_seq;
|
cond->__data.__wakeup_seq = cond->__data.__total_seq;
|
||||||
|
cond->__data.__woken_seq = cond->__data.__total_seq;
|
||||||
|
/* Signal that a broadcast happened. */
|
||||||
|
++cond->__data.__broadcast_seq;
|
||||||
|
|
||||||
/* We are done. */
|
/* We are done. */
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
|
@ -36,6 +36,7 @@ struct _condvar_cleanup_buffer
|
|||||||
int oldtype;
|
int oldtype;
|
||||||
pthread_cond_t *cond;
|
pthread_cond_t *cond;
|
||||||
pthread_mutex_t *mutex;
|
pthread_mutex_t *mutex;
|
||||||
|
unsigned int bc_seq;
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -85,6 +86,8 @@ __pthread_cond_timedwait (cond, mutex, abstime)
|
|||||||
unsigned long long int val;
|
unsigned long long int val;
|
||||||
unsigned long long int seq;
|
unsigned long long int seq;
|
||||||
val = seq = cond->__data.__wakeup_seq;
|
val = seq = cond->__data.__wakeup_seq;
|
||||||
|
/* Remember the broadcast counter. */
|
||||||
|
cbuffer.bc_seq = cond->__data.__broadcast_seq;
|
||||||
|
|
||||||
/* The futex syscall operates on a 32-bit word. That is fine, we
|
/* The futex syscall operates on a 32-bit word. That is fine, we
|
||||||
just use the low 32 bits of the sequence counter. */
|
just use the low 32 bits of the sequence counter. */
|
||||||
@ -139,7 +142,12 @@ __pthread_cond_timedwait (cond, mutex, abstime)
|
|||||||
}
|
}
|
||||||
/* Did we already time out? */
|
/* Did we already time out? */
|
||||||
if (__builtin_expect (rt.tv_sec < 0, 0))
|
if (__builtin_expect (rt.tv_sec < 0, 0))
|
||||||
goto timeout;
|
{
|
||||||
|
if (cbuffer.bc_seq != cond->__data.__broadcast_seq)
|
||||||
|
goto bc_out;
|
||||||
|
|
||||||
|
goto timeout;
|
||||||
|
}
|
||||||
|
|
||||||
/* Prepare to wait. Release the condvar futex. */
|
/* Prepare to wait. Release the condvar futex. */
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
@ -157,6 +165,10 @@ __pthread_cond_timedwait (cond, mutex, abstime)
|
|||||||
/* We are going to look at shared data again, so get the lock. */
|
/* We are going to look at shared data again, so get the lock. */
|
||||||
lll_mutex_lock(cond->__data.__lock);
|
lll_mutex_lock(cond->__data.__lock);
|
||||||
|
|
||||||
|
/* If a broadcast happened, we are done. */
|
||||||
|
if (cbuffer.bc_seq != cond->__data.__broadcast_seq)
|
||||||
|
goto bc_out;
|
||||||
|
|
||||||
/* Check whether we are eligible for wakeup. */
|
/* Check whether we are eligible for wakeup. */
|
||||||
val = cond->__data.__wakeup_seq;
|
val = cond->__data.__wakeup_seq;
|
||||||
if (val != seq && cond->__data.__woken_seq != val)
|
if (val != seq && cond->__data.__woken_seq != val)
|
||||||
@ -178,6 +190,7 @@ __pthread_cond_timedwait (cond, mutex, abstime)
|
|||||||
/* Another thread woken up. */
|
/* Another thread woken up. */
|
||||||
++cond->__data.__woken_seq;
|
++cond->__data.__woken_seq;
|
||||||
|
|
||||||
|
bc_out:
|
||||||
/* We are done with the condvar. */
|
/* We are done with the condvar. */
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ struct _condvar_cleanup_buffer
|
|||||||
int oldtype;
|
int oldtype;
|
||||||
pthread_cond_t *cond;
|
pthread_cond_t *cond;
|
||||||
pthread_mutex_t *mutex;
|
pthread_mutex_t *mutex;
|
||||||
|
unsigned int bc_seq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -45,10 +46,13 @@ __condvar_cleanup (void *arg)
|
|||||||
/* We are going to modify shared data. */
|
/* We are going to modify shared data. */
|
||||||
lll_mutex_lock (cbuffer->cond->__data.__lock);
|
lll_mutex_lock (cbuffer->cond->__data.__lock);
|
||||||
|
|
||||||
/* This thread is not waiting anymore. Adjust the sequence counters
|
if (cbuffer->bc_seq == cbuffer->cond->__data.__broadcast_seq)
|
||||||
appropriately. */
|
{
|
||||||
++cbuffer->cond->__data.__wakeup_seq;
|
/* This thread is not waiting anymore. Adjust the sequence counters
|
||||||
++cbuffer->cond->__data.__woken_seq;
|
appropriately. */
|
||||||
|
++cbuffer->cond->__data.__wakeup_seq;
|
||||||
|
++cbuffer->cond->__data.__woken_seq;
|
||||||
|
}
|
||||||
|
|
||||||
/* We are done. */
|
/* We are done. */
|
||||||
lll_mutex_unlock (cbuffer->cond->__data.__lock);
|
lll_mutex_unlock (cbuffer->cond->__data.__lock);
|
||||||
@ -111,6 +115,8 @@ __pthread_cond_wait (cond, mutex)
|
|||||||
unsigned long long int val;
|
unsigned long long int val;
|
||||||
unsigned long long int seq;
|
unsigned long long int seq;
|
||||||
val = seq = cond->__data.__wakeup_seq;
|
val = seq = cond->__data.__wakeup_seq;
|
||||||
|
/* Remember the broadcast counter. */
|
||||||
|
cbuffer.bc_seq = cond->__data.__broadcast_seq;
|
||||||
|
|
||||||
/* The futex syscall operates on a 32-bit word. That is fine, we
|
/* The futex syscall operates on a 32-bit word. That is fine, we
|
||||||
just use the low 32 bits of the sequence counter. */
|
just use the low 32 bits of the sequence counter. */
|
||||||
@ -137,6 +143,10 @@ __pthread_cond_wait (cond, mutex)
|
|||||||
/* Disable asynchronous cancellation. */
|
/* Disable asynchronous cancellation. */
|
||||||
__pthread_disable_asynccancel (cbuffer.oldtype);
|
__pthread_disable_asynccancel (cbuffer.oldtype);
|
||||||
|
|
||||||
|
/* If a broadcast happened, we are done. */
|
||||||
|
if (cbuffer.bc_seq != cond->__data.__broadcast_seq)
|
||||||
|
goto bc_out;
|
||||||
|
|
||||||
/* We are going to look at shared data again, so get the lock. */
|
/* We are going to look at shared data again, so get the lock. */
|
||||||
lll_mutex_lock (cond->__data.__lock);
|
lll_mutex_lock (cond->__data.__lock);
|
||||||
|
|
||||||
@ -148,6 +158,7 @@ __pthread_cond_wait (cond, mutex)
|
|||||||
/* Another thread woken up. */
|
/* Another thread woken up. */
|
||||||
++cond->__data.__woken_seq;
|
++cond->__data.__woken_seq;
|
||||||
|
|
||||||
|
bc_out:
|
||||||
/* We are done with the condvar. */
|
/* We are done with the condvar. */
|
||||||
lll_mutex_unlock (cond->__data.__lock);
|
lll_mutex_unlock (cond->__data.__lock);
|
||||||
|
|
||||||
|
@ -81,6 +81,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long long int __align;
|
long long int __align;
|
||||||
|
@ -81,6 +81,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long long int __align;
|
long long int __align;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -74,6 +74,9 @@ __pthread_cond_broadcast:
|
|||||||
woken up. */
|
woken up. */
|
||||||
3: movl %ecx, (%ebx)
|
3: movl %ecx, (%ebx)
|
||||||
movl %eax, 4(%ebx)
|
movl %eax, 4(%ebx)
|
||||||
|
movl %ecx, woken_seq-wakeup_seq(%ebx)
|
||||||
|
movl %eax, woken_seq-wakeup_seq+4(%ebx)
|
||||||
|
addl $1, broadcast_seq-wakeup_seq(%ebx)
|
||||||
|
|
||||||
/* Get the address of the mutex used. */
|
/* Get the address of the mutex used. */
|
||||||
movl dep_mutex-wakeup_seq(%ebx), %edi
|
movl dep_mutex-wakeup_seq(%ebx), %edi
|
||||||
|
@ -83,15 +83,17 @@ __pthread_cond_timedwait:
|
|||||||
addl $1, total_seq(%ebx)
|
addl $1, total_seq(%ebx)
|
||||||
adcl $0, total_seq+4(%ebx)
|
adcl $0, total_seq+4(%ebx)
|
||||||
|
|
||||||
#define FRAME_SIZE 20
|
#define FRAME_SIZE 24
|
||||||
subl $FRAME_SIZE, %esp
|
subl $FRAME_SIZE, %esp
|
||||||
.Lsubl:
|
.Lsubl:
|
||||||
|
|
||||||
/* Get and store current wakeup_seq value. */
|
/* Get and store current wakeup_seq value. */
|
||||||
movl wakeup_seq(%ebx), %edi
|
movl wakeup_seq(%ebx), %edi
|
||||||
movl wakeup_seq+4(%ebx), %edx
|
movl wakeup_seq+4(%ebx), %edx
|
||||||
|
movl broadcast_seq(%ebx), %eax
|
||||||
movl %edi, 12(%esp)
|
movl %edi, 12(%esp)
|
||||||
movl %edx, 16(%esp)
|
movl %edx, 16(%esp)
|
||||||
|
movl %eax, 20(%esp)
|
||||||
|
|
||||||
/* Get the current time. */
|
/* Get the current time. */
|
||||||
8: movl %ebx, %edx
|
8: movl %ebx, %edx
|
||||||
@ -139,7 +141,8 @@ __pthread_cond_timedwait:
|
|||||||
addl $1000000000, %edx
|
addl $1000000000, %edx
|
||||||
subl $1, %ecx
|
subl $1, %ecx
|
||||||
12: testl %ecx, %ecx
|
12: testl %ecx, %ecx
|
||||||
js 13f
|
movl $-ETIMEDOUT, %esi
|
||||||
|
js 6f
|
||||||
|
|
||||||
/* Store relative timeout. */
|
/* Store relative timeout. */
|
||||||
21: movl %ecx, 4(%esp)
|
21: movl %ecx, 4(%esp)
|
||||||
@ -184,7 +187,11 @@ __pthread_cond_timedwait:
|
|||||||
#endif
|
#endif
|
||||||
jnz 5f
|
jnz 5f
|
||||||
|
|
||||||
6: movl woken_seq(%ebx), %eax
|
6: movl broadcast_seq(%ebx), %eax
|
||||||
|
cmpl 20(%esp), %eax
|
||||||
|
jne 23f
|
||||||
|
|
||||||
|
movl woken_seq(%ebx), %eax
|
||||||
movl woken_seq+4(%ebx), %ecx
|
movl woken_seq+4(%ebx), %ecx
|
||||||
|
|
||||||
movl wakeup_seq(%ebx), %edi
|
movl wakeup_seq(%ebx), %edi
|
||||||
@ -203,16 +210,19 @@ __pthread_cond_timedwait:
|
|||||||
15: cmpl $-ETIMEDOUT, %esi
|
15: cmpl $-ETIMEDOUT, %esi
|
||||||
jne 8b
|
jne 8b
|
||||||
|
|
||||||
13: addl $1, wakeup_seq(%ebx)
|
addl $1, wakeup_seq(%ebx)
|
||||||
adcl $0, wakeup_seq+4(%ebx)
|
adcl $0, wakeup_seq+4(%ebx)
|
||||||
movl $ETIMEDOUT, %esi
|
movl $ETIMEDOUT, %esi
|
||||||
jmp 14f
|
jmp 14f
|
||||||
|
|
||||||
|
23: xorl %esi, %esi
|
||||||
|
jmp 24f
|
||||||
|
|
||||||
9: xorl %esi, %esi
|
9: xorl %esi, %esi
|
||||||
14: addl $1, woken_seq(%ebx)
|
14: addl $1, woken_seq(%ebx)
|
||||||
adcl $0, woken_seq+4(%ebx)
|
adcl $0, woken_seq+4(%ebx)
|
||||||
|
|
||||||
LOCK
|
24: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
subl $1, (%ebx)
|
subl $1, (%ebx)
|
||||||
#else
|
#else
|
||||||
@ -332,7 +342,8 @@ __pthread_cond_timedwait:
|
|||||||
addl $1000000000, %edx
|
addl $1000000000, %edx
|
||||||
subl $1, %ecx
|
subl $1, %ecx
|
||||||
20: testl %ecx, %ecx
|
20: testl %ecx, %ecx
|
||||||
js 13b
|
movl $-ETIMEDOUT, %esi
|
||||||
|
js 6b
|
||||||
jmp 21b
|
jmp 21b
|
||||||
#endif
|
#endif
|
||||||
.size __pthread_cond_timedwait, .-__pthread_cond_timedwait
|
.size __pthread_cond_timedwait, .-__pthread_cond_timedwait
|
||||||
@ -372,13 +383,17 @@ __condvar_tw_cleanup:
|
|||||||
#endif
|
#endif
|
||||||
call __lll_mutex_lock_wait
|
call __lll_mutex_lock_wait
|
||||||
|
|
||||||
1: addl $1, wakeup_seq(%ebx)
|
1: movl broadcast_seq(%ebx), %eax
|
||||||
|
cmpl 12(%esp), %eax
|
||||||
|
jne 3f
|
||||||
|
|
||||||
|
addl $1, wakeup_seq(%ebx)
|
||||||
adcl $0, wakeup_seq+4(%ebx)
|
adcl $0, wakeup_seq+4(%ebx)
|
||||||
|
|
||||||
addl $1, woken_seq(%ebx)
|
addl $1, woken_seq(%ebx)
|
||||||
adcl $0, woken_seq+4(%ebx)
|
adcl $0, woken_seq+4(%ebx)
|
||||||
|
|
||||||
LOCK
|
3: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
subl $1, (%ebx)
|
subl $1, (%ebx)
|
||||||
#else
|
#else
|
||||||
|
@ -80,15 +80,17 @@ __pthread_cond_wait:
|
|||||||
addl $1, total_seq(%ebx)
|
addl $1, total_seq(%ebx)
|
||||||
adcl $0, total_seq+4(%ebx)
|
adcl $0, total_seq+4(%ebx)
|
||||||
|
|
||||||
#define FRAME_SIZE 12
|
#define FRAME_SIZE 16
|
||||||
subl $FRAME_SIZE, %esp
|
subl $FRAME_SIZE, %esp
|
||||||
.Lsubl:
|
.Lsubl:
|
||||||
|
|
||||||
/* Get and store current wakeup_seq value. */
|
/* Get and store current wakeup_seq value. */
|
||||||
movl wakeup_seq(%ebx), %edi
|
movl wakeup_seq(%ebx), %edi
|
||||||
movl wakeup_seq+4(%ebx), %edx
|
movl wakeup_seq+4(%ebx), %edx
|
||||||
|
movl broadcast_seq(%ebx), %eax
|
||||||
movl %edi, 4(%esp)
|
movl %edi, 4(%esp)
|
||||||
movl %edx, 8(%esp)
|
movl %edx, 8(%esp)
|
||||||
|
movl %eax, 12(%esp)
|
||||||
|
|
||||||
/* Unlock. */
|
/* Unlock. */
|
||||||
8: LOCK
|
8: LOCK
|
||||||
@ -127,7 +129,11 @@ __pthread_cond_wait:
|
|||||||
#endif
|
#endif
|
||||||
jnz 5f
|
jnz 5f
|
||||||
|
|
||||||
6: movl woken_seq(%ebx), %eax
|
6: movl broadcast_seq(%ebx), %eax
|
||||||
|
cmpl 12(%esp), %eax
|
||||||
|
jne 16f
|
||||||
|
|
||||||
|
movl woken_seq(%ebx), %eax
|
||||||
movl woken_seq+4(%ebx), %ecx
|
movl woken_seq+4(%ebx), %ecx
|
||||||
|
|
||||||
movl wakeup_seq(%ebx), %edi
|
movl wakeup_seq(%ebx), %edi
|
||||||
@ -146,7 +152,8 @@ __pthread_cond_wait:
|
|||||||
9: addl $1, woken_seq(%ebx)
|
9: addl $1, woken_seq(%ebx)
|
||||||
adcl $0, woken_seq+4(%ebx)
|
adcl $0, woken_seq+4(%ebx)
|
||||||
|
|
||||||
LOCK
|
/* Unlock */
|
||||||
|
16: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
subl $1, (%ebx)
|
subl $1, (%ebx)
|
||||||
#else
|
#else
|
||||||
@ -264,13 +271,17 @@ __condvar_w_cleanup:
|
|||||||
#endif
|
#endif
|
||||||
call __lll_mutex_lock_wait
|
call __lll_mutex_lock_wait
|
||||||
|
|
||||||
1: addl $1, wakeup_seq(%ebx)
|
1: movl broadcast_seq(%ebx), %eax
|
||||||
|
cmpl 12(%esp), %eax
|
||||||
|
jne 3f
|
||||||
|
|
||||||
|
addl $1, wakeup_seq(%ebx)
|
||||||
adcl $0, wakeup_seq+4(%ebx)
|
adcl $0, wakeup_seq+4(%ebx)
|
||||||
|
|
||||||
addl $1, woken_seq(%ebx)
|
addl $1, woken_seq(%ebx)
|
||||||
adcl $0, woken_seq+4(%ebx)
|
adcl $0, woken_seq+4(%ebx)
|
||||||
|
|
||||||
LOCK
|
3: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
subl $1, (%ebx)
|
subl $1, (%ebx)
|
||||||
#else
|
#else
|
||||||
|
@ -81,6 +81,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long int __align;
|
long int __align;
|
||||||
|
@ -9,3 +9,4 @@ total_seq offsetof (pthread_cond_t, __data.__total_seq)
|
|||||||
wakeup_seq offsetof (pthread_cond_t, __data.__wakeup_seq)
|
wakeup_seq offsetof (pthread_cond_t, __data.__wakeup_seq)
|
||||||
woken_seq offsetof (pthread_cond_t, __data.__woken_seq)
|
woken_seq offsetof (pthread_cond_t, __data.__woken_seq)
|
||||||
dep_mutex offsetof (pthread_cond_t, __data.__mutex)
|
dep_mutex offsetof (pthread_cond_t, __data.__mutex)
|
||||||
|
broadcast_seq offsetof (pthread_cond_t, __data.__broadcast_seq)
|
||||||
|
@ -101,6 +101,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long long int __align;
|
long long int __align;
|
||||||
|
@ -100,6 +100,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long long int __align;
|
long long int __align;
|
||||||
|
@ -101,6 +101,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long long int __align;
|
long long int __align;
|
||||||
|
@ -81,6 +81,7 @@ typedef union
|
|||||||
unsigned long long int __wakeup_seq;
|
unsigned long long int __wakeup_seq;
|
||||||
unsigned long long int __woken_seq;
|
unsigned long long int __woken_seq;
|
||||||
void *__mutex;
|
void *__mutex;
|
||||||
|
unsigned int __broadcast_seq;
|
||||||
} __data;
|
} __data;
|
||||||
char __size[__SIZEOF_PTHREAD_COND_T];
|
char __size[__SIZEOF_PTHREAD_COND_T];
|
||||||
long int __align;
|
long int __align;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
@ -63,6 +63,8 @@ __pthread_cond_broadcast:
|
|||||||
/* Cause all currently waiting threads to recognize they are
|
/* Cause all currently waiting threads to recognize they are
|
||||||
woken up. */
|
woken up. */
|
||||||
movq %rcx, (%rdi)
|
movq %rcx, (%rdi)
|
||||||
|
movq %rcx, woken_seq-wakeup_seq(%rdi)
|
||||||
|
incl broadcast_seq-wakeup_seq(%rdi)
|
||||||
|
|
||||||
/* Get the address of the mutex used. */
|
/* Get the address of the mutex used. */
|
||||||
movq dep_mutex-wakeup_seq(%rdi), %r8
|
movq dep_mutex-wakeup_seq(%rdi), %r8
|
||||||
@ -110,12 +112,12 @@ __pthread_cond_broadcast:
|
|||||||
#endif
|
#endif
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
/* Unlock in loop requires waekup. */
|
/* Unlock in loop requires wakeup. */
|
||||||
5: addq $cond_lock-wakeup_seq, %rdi
|
5: addq $cond_lock-wakeup_seq, %rdi
|
||||||
callq __lll_mutex_unlock_wake
|
callq __lll_mutex_unlock_wake
|
||||||
jmp 6b
|
jmp 6b
|
||||||
|
|
||||||
/* Unlock in loop requires waekup. */
|
/* Unlock in loop requires wakeup. */
|
||||||
7: addq $cond_lock-wakeup_seq, %rdi
|
7: addq $cond_lock-wakeup_seq, %rdi
|
||||||
callq __lll_mutex_unlock_wake
|
callq __lll_mutex_unlock_wake
|
||||||
subq $cond_lock-wakeup_seq, %rdi
|
subq $cond_lock-wakeup_seq, %rdi
|
||||||
|
@ -51,7 +51,8 @@ __pthread_cond_timedwait:
|
|||||||
.Lpush_r13:
|
.Lpush_r13:
|
||||||
pushq %r14
|
pushq %r14
|
||||||
.Lpush_r14:
|
.Lpush_r14:
|
||||||
subq $80, %rsp
|
#define FRAME_SIZE 80
|
||||||
|
subq $FRAME_SIZE, %rsp
|
||||||
.Lsubq:
|
.Lsubq:
|
||||||
/* Stack frame:
|
/* Stack frame:
|
||||||
|
|
||||||
@ -67,6 +68,8 @@ __pthread_cond_timedwait:
|
|||||||
+--------------------------+
|
+--------------------------+
|
||||||
rsp + 8 | condvar pointer |
|
rsp + 8 | condvar pointer |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
|
rsp + 4 | old broadcast_seq value |
|
||||||
|
+--------------------------+
|
||||||
rsp + 0 | old cancellation mode |
|
rsp + 0 | old cancellation mode |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
*/
|
*/
|
||||||
@ -116,7 +119,9 @@ __pthread_cond_timedwait:
|
|||||||
/* Get and store current wakeup_seq value. */
|
/* Get and store current wakeup_seq value. */
|
||||||
movq 8(%rsp), %rdi
|
movq 8(%rsp), %rdi
|
||||||
movq wakeup_seq(%rdi), %r12
|
movq wakeup_seq(%rdi), %r12
|
||||||
|
movl broadcast_seq(%rdi), %edx
|
||||||
movq %r12, 40(%rsp)
|
movq %r12, 40(%rsp)
|
||||||
|
movl %edx, 4(%rsp)
|
||||||
|
|
||||||
/* Get the current time. */
|
/* Get the current time. */
|
||||||
8:
|
8:
|
||||||
@ -160,7 +165,8 @@ __pthread_cond_timedwait:
|
|||||||
decq %rcx
|
decq %rcx
|
||||||
12: testq %rcx, %rcx
|
12: testq %rcx, %rcx
|
||||||
movq 8(%rsp), %rdi
|
movq 8(%rsp), %rdi
|
||||||
js 13f
|
movq $-ETIMEDOUT, %r14
|
||||||
|
js 6f
|
||||||
|
|
||||||
/* Store relative timeout. */
|
/* Store relative timeout. */
|
||||||
21: movq %rcx, 24(%rsp)
|
21: movq %rcx, 24(%rsp)
|
||||||
@ -201,10 +207,15 @@ __pthread_cond_timedwait:
|
|||||||
#endif
|
#endif
|
||||||
jne 5f
|
jne 5f
|
||||||
|
|
||||||
6: movq woken_seq(%rdi), %rax
|
6: movl broadcast_seq(%rdi), %edx
|
||||||
|
|
||||||
|
movq woken_seq(%rdi), %rax
|
||||||
|
|
||||||
movq wakeup_seq(%rdi), %r12
|
movq wakeup_seq(%rdi), %r12
|
||||||
|
|
||||||
|
cmpl 4(%rsp), %edx
|
||||||
|
jne 23f
|
||||||
|
|
||||||
cmpq 40(%rsp), %r12
|
cmpq 40(%rsp), %r12
|
||||||
jbe 15f
|
jbe 15f
|
||||||
|
|
||||||
@ -218,10 +229,13 @@ __pthread_cond_timedwait:
|
|||||||
movq $ETIMEDOUT, %r14
|
movq $ETIMEDOUT, %r14
|
||||||
jmp 14f
|
jmp 14f
|
||||||
|
|
||||||
|
23: xorq %r14, %r14
|
||||||
|
jmp 24f
|
||||||
|
|
||||||
9: xorq %r14, %r14
|
9: xorq %r14, %r14
|
||||||
14: incq woken_seq(%rdi)
|
14: incq woken_seq(%rdi)
|
||||||
|
|
||||||
LOCK
|
24: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
decl (%rdi)
|
decl (%rdi)
|
||||||
#else
|
#else
|
||||||
@ -239,7 +253,7 @@ __pthread_cond_timedwait:
|
|||||||
testq %rax, %rax
|
testq %rax, %rax
|
||||||
cmoveq %r14, %rax
|
cmoveq %r14, %rax
|
||||||
|
|
||||||
18: addq $80, %rsp
|
18: addq $FRAME_SIZE, %rsp
|
||||||
.Laddq:
|
.Laddq:
|
||||||
popq %r14
|
popq %r14
|
||||||
.Lpop_r14:
|
.Lpop_r14:
|
||||||
@ -259,7 +273,7 @@ __pthread_cond_timedwait:
|
|||||||
callq __lll_mutex_lock_wait
|
callq __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
/* Unlock in loop requires waekup. */
|
/* Unlock in loop requires wakeup. */
|
||||||
3:
|
3:
|
||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
addq $cond_lock, %rdi
|
addq $cond_lock, %rdi
|
||||||
@ -278,7 +292,7 @@ __pthread_cond_timedwait:
|
|||||||
#endif
|
#endif
|
||||||
jmp 6b
|
jmp 6b
|
||||||
|
|
||||||
/* Unlock after loop requires waekup. */
|
/* Unlock after loop requires wakeup. */
|
||||||
10:
|
10:
|
||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
addq $cond_lock, %rdi
|
addq $cond_lock, %rdi
|
||||||
@ -325,7 +339,8 @@ __pthread_cond_timedwait:
|
|||||||
decq %rcx
|
decq %rcx
|
||||||
20: testq %rcx, %rcx
|
20: testq %rcx, %rcx
|
||||||
movq 8(%rsp), %rdi
|
movq 8(%rsp), %rdi
|
||||||
js 13b
|
movq $-ETIMEDOUT, %r14
|
||||||
|
js 6b
|
||||||
jmp 21b
|
jmp 21b
|
||||||
#endif
|
#endif
|
||||||
.LENDCODE:
|
.LENDCODE:
|
||||||
@ -394,7 +409,7 @@ versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
|
|||||||
.uleb128 4
|
.uleb128 4
|
||||||
.byte 0x40+.Lsubq-.Lpush_r14 # DW_CFA_advance_loc+N
|
.byte 0x40+.Lsubq-.Lpush_r14 # DW_CFA_advance_loc+N
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
.uleb128 112
|
.uleb128 32+FRAME_SIZE
|
||||||
.byte 3 # DW_CFA_advance_loc2
|
.byte 3 # DW_CFA_advance_loc2
|
||||||
.2byte .Laddq-.Lsubq
|
.2byte .Laddq-.Lsubq
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
@ -413,7 +428,7 @@ versioned_symbol (libpthread, __pthread_cond_timedwait, pthread_cond_timedwait,
|
|||||||
.byte 0xcc # DW_CFA_restore %r12
|
.byte 0xcc # DW_CFA_restore %r12
|
||||||
.byte 0x40+.LSbl1-.Lpop_r12 # DW_CFA_advance_loc+N
|
.byte 0x40+.LSbl1-.Lpop_r12 # DW_CFA_advance_loc+N
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
.uleb128 112
|
.uleb128 32+FRAME_SIZE
|
||||||
.byte 0x8c # DW_CFA_offset %r12
|
.byte 0x8c # DW_CFA_offset %r12
|
||||||
.uleb128 2
|
.uleb128 2
|
||||||
.byte 0x8d # DW_CFA_offset %r13
|
.byte 0x8d # DW_CFA_offset %r13
|
||||||
|
@ -61,11 +61,15 @@ __condvar_cleanup:
|
|||||||
subq $cond_lock, %rdi
|
subq $cond_lock, %rdi
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
1: incq wakeup_seq(%rdi)
|
1: movl broadcast_seq(%rdi), %edx
|
||||||
|
cmpl 4(%r8), %edx
|
||||||
|
jne 3f
|
||||||
|
|
||||||
|
incq wakeup_seq(%rdi)
|
||||||
|
|
||||||
incq woken_seq(%rdi)
|
incq woken_seq(%rdi)
|
||||||
|
|
||||||
LOCK
|
3: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
decl (%rdi)
|
decl (%rdi)
|
||||||
#else
|
#else
|
||||||
@ -99,20 +103,23 @@ __pthread_cond_wait:
|
|||||||
.LSTARTCODE:
|
.LSTARTCODE:
|
||||||
pushq %r12
|
pushq %r12
|
||||||
.Lpush_r12:
|
.Lpush_r12:
|
||||||
subq $64, %rsp
|
#define FRAME_SIZE 64
|
||||||
|
subq $FRAME_SIZE, %rsp
|
||||||
.Lsubq:
|
.Lsubq:
|
||||||
/* Stack frame:
|
/* Stack frame:
|
||||||
|
|
||||||
rsp + 64
|
rsp + 64
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
rsp + 32 | cleanup buffer |
|
rsp + 32 | cleanup buffer |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
rsp + 24 | old wake_seq value |
|
rsp + 24 | old wake_seq value |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
rsp + 16 | mutex pointer |
|
rsp + 16 | mutex pointer |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
rsp + 8 | condvar pointer |
|
rsp + 8 | condvar pointer |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
|
rsp + 4 | old broadcast_seq value |
|
||||||
|
+--------------------------+
|
||||||
rsp + 0 | old cancellation mode |
|
rsp + 0 | old cancellation mode |
|
||||||
+--------------------------+
|
+--------------------------+
|
||||||
*/
|
*/
|
||||||
@ -161,7 +168,9 @@ __pthread_cond_wait:
|
|||||||
/* Get and store current wakeup_seq value. */
|
/* Get and store current wakeup_seq value. */
|
||||||
movq 8(%rsp), %rdi
|
movq 8(%rsp), %rdi
|
||||||
movq wakeup_seq(%rdi), %r12
|
movq wakeup_seq(%rdi), %r12
|
||||||
|
movl broadcast_seq(%rdi), %edx
|
||||||
movq %r12, 24(%rsp)
|
movq %r12, 24(%rsp)
|
||||||
|
movl %edx, 4(%rsp)
|
||||||
|
|
||||||
/* Unlock. */
|
/* Unlock. */
|
||||||
8: LOCK
|
8: LOCK
|
||||||
@ -198,10 +207,15 @@ __pthread_cond_wait:
|
|||||||
#endif
|
#endif
|
||||||
jnz 5f
|
jnz 5f
|
||||||
|
|
||||||
6: movq woken_seq(%rdi), %rax
|
6: movl broadcast_seq(%rdi), %edx
|
||||||
|
|
||||||
|
movq woken_seq(%rdi), %rax
|
||||||
|
|
||||||
movq wakeup_seq(%rdi), %r12
|
movq wakeup_seq(%rdi), %r12
|
||||||
|
|
||||||
|
cmpl 4(%rsp), %edx
|
||||||
|
jne 16f
|
||||||
|
|
||||||
cmpq 24(%rsp), %r12
|
cmpq 24(%rsp), %r12
|
||||||
jbe 8b
|
jbe 8b
|
||||||
|
|
||||||
@ -210,7 +224,8 @@ __pthread_cond_wait:
|
|||||||
|
|
||||||
incq woken_seq(%rdi)
|
incq woken_seq(%rdi)
|
||||||
|
|
||||||
LOCK
|
/* Unlock */
|
||||||
|
16: LOCK
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
decl (%rdi)
|
decl (%rdi)
|
||||||
#else
|
#else
|
||||||
@ -224,7 +239,7 @@ __pthread_cond_wait:
|
|||||||
|
|
||||||
movq 16(%rsp), %rdi
|
movq 16(%rsp), %rdi
|
||||||
callq __pthread_mutex_cond_lock
|
callq __pthread_mutex_cond_lock
|
||||||
14: addq $64, %rsp
|
14: addq $FRAME_SIZE, %rsp
|
||||||
.Laddq:
|
.Laddq:
|
||||||
|
|
||||||
popq %r12
|
popq %r12
|
||||||
@ -242,7 +257,7 @@ __pthread_cond_wait:
|
|||||||
callq __lll_mutex_lock_wait
|
callq __lll_mutex_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
/* Unlock in loop requires waekup. */
|
/* Unlock in loop requires wakeup. */
|
||||||
3:
|
3:
|
||||||
#if cond_lock != 0
|
#if cond_lock != 0
|
||||||
addq $cond_lock, %rdi
|
addq $cond_lock, %rdi
|
||||||
@ -343,7 +358,7 @@ versioned_symbol (libpthread, __pthread_cond_wait, pthread_cond_wait,
|
|||||||
.uleb128 2
|
.uleb128 2
|
||||||
.byte 0x40+.Lsubq-.Lpush_r12 # DW_CFA_advance_loc+N
|
.byte 0x40+.Lsubq-.Lpush_r12 # DW_CFA_advance_loc+N
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
.uleb128 80
|
.uleb128 16+FRAME_SIZE
|
||||||
.byte 2 # DW_CFA_advance_loc1
|
.byte 2 # DW_CFA_advance_loc1
|
||||||
.byte .Laddq-.Lsubq
|
.byte .Laddq-.Lsubq
|
||||||
.byte 14 # DW_CFA_def_cfa_offset
|
.byte 14 # DW_CFA_def_cfa_offset
|
||||||
|
105
nptl/tst-cond16.c
Normal file
105
nptl/tst-cond16.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/* Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
|
||||||
|
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
bool n, exiting;
|
||||||
|
FILE *f;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
void *
|
||||||
|
tf (void *dummy)
|
||||||
|
{
|
||||||
|
bool loop = true;
|
||||||
|
|
||||||
|
while (loop)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
while (n && !exiting)
|
||||||
|
pthread_cond_wait (&cv, &lock);
|
||||||
|
n = true;
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
|
||||||
|
fputs (".", f);
|
||||||
|
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
n = false;
|
||||||
|
if (exiting)
|
||||||
|
loop = false;
|
||||||
|
#ifdef UNLOCK_AFTER_BROADCAST
|
||||||
|
pthread_cond_broadcast (&cv);
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
#else
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
pthread_cond_broadcast (&cv);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
do_test (void)
|
||||||
|
{
|
||||||
|
f = fopen ("/dev/null", "w");
|
||||||
|
if (f == NULL)
|
||||||
|
{
|
||||||
|
printf ("couldn't open /dev/null, %m\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = sysconf (_SC_NPROCESSORS_ONLN);
|
||||||
|
if (count <= 0)
|
||||||
|
count = 1;
|
||||||
|
count *= 4;
|
||||||
|
|
||||||
|
pthread_t th[count];
|
||||||
|
int i, ret;
|
||||||
|
for (i = 0; i < count; ++i)
|
||||||
|
if ((ret = pthread_create (&th[i], NULL, tf, NULL)) != 0)
|
||||||
|
{
|
||||||
|
errno = ret;
|
||||||
|
printf ("pthread_create %d failed: %m\n", i);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct timespec ts = { .tv_sec = 20, .tv_nsec = 0 };
|
||||||
|
while (nanosleep (&ts, &ts) != 0);
|
||||||
|
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
exiting = true;
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
|
||||||
|
for (i = 0; i < count; ++i)
|
||||||
|
pthread_join (th[i], NULL);
|
||||||
|
|
||||||
|
fclose (f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TEST_FUNCTION do_test ()
|
||||||
|
#define TIMEOUT 40
|
||||||
|
#include "../test-skeleton.c"
|
2
nptl/tst-cond17.c
Normal file
2
nptl/tst-cond17.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define UNLOCK_AFTER_BROADCAST 1
|
||||||
|
#include "tst-cond16.c"
|
117
nptl/tst-cond18.c
Normal file
117
nptl/tst-cond18.c
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/* Copyright (C) 2004 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
|
||||||
|
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
bool exiting;
|
||||||
|
int fd, count, spins, nn;
|
||||||
|
|
||||||
|
void *
|
||||||
|
tf (void *id)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
|
||||||
|
if ((long) id == 0)
|
||||||
|
{
|
||||||
|
while (!exiting)
|
||||||
|
{
|
||||||
|
if ((spins++ % 1000) == 0)
|
||||||
|
write (fd, ".", 1);
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
int njobs = rand () % (count + 1);
|
||||||
|
nn = njobs;
|
||||||
|
if ((rand () % 30) == 0)
|
||||||
|
pthread_cond_broadcast (&cv);
|
||||||
|
else
|
||||||
|
while (njobs--)
|
||||||
|
pthread_cond_signal (&cv);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_cond_broadcast (&cv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (!exiting)
|
||||||
|
{
|
||||||
|
while (!nn && !exiting)
|
||||||
|
pthread_cond_wait (&cv, &lock);
|
||||||
|
--nn;
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
do_test (void)
|
||||||
|
{
|
||||||
|
fd = open ("/dev/null", O_WRONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
printf ("couldn't open /dev/null, %m\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = sysconf (_SC_NPROCESSORS_ONLN);
|
||||||
|
if (count <= 0)
|
||||||
|
count = 1;
|
||||||
|
count *= 8;
|
||||||
|
|
||||||
|
pthread_t th[count + 1];
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
for (i = 0; i <= count; ++i)
|
||||||
|
if ((ret = pthread_create (&th[i], NULL, tf, (void *) (long) i)) != 0)
|
||||||
|
{
|
||||||
|
errno = ret;
|
||||||
|
printf ("pthread_create %d failed: %m\n", i);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct timespec ts = { .tv_sec = 20, .tv_nsec = 0 };
|
||||||
|
while (nanosleep (&ts, &ts) != 0);
|
||||||
|
|
||||||
|
pthread_mutex_lock (&lock);
|
||||||
|
exiting = true;
|
||||||
|
pthread_mutex_unlock (&lock);
|
||||||
|
|
||||||
|
for (i = 0; i < count; ++i)
|
||||||
|
pthread_join (th[i], NULL);
|
||||||
|
|
||||||
|
close (fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TEST_FUNCTION do_test ()
|
||||||
|
#define TIMEOUT 40
|
||||||
|
#include "../test-skeleton.c"
|
Loading…
Reference in New Issue
Block a user