mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 21:10:07 +00:00
Update.
2002-12-04 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/i386/lowlevellock.h: Mark asms as volatile and add memory clobbers to lock operations.
This commit is contained in:
parent
d16055ee52
commit
7a5cdb30e3
@ -1,3 +1,8 @@
|
|||||||
|
2002-12-04 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/i386/lowlevellock.h: Mark asms as
|
||||||
|
volatile and add memory clobbers to lock operations.
|
||||||
|
|
||||||
2002-12-03 Ulrich Drepper <drepper@redhat.com>
|
2002-12-03 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/i386/i686/bits/atomic.h: Use i486 version.
|
* sysdeps/i386/i686/bits/atomic.h: Use i486 version.
|
||||||
|
@ -105,7 +105,7 @@ get_cached_stack (size_t *sizep, void **memp)
|
|||||||
{
|
{
|
||||||
struct pthread *curr;
|
struct pthread *curr;
|
||||||
|
|
||||||
curr = list_entry(entry, struct pthread, header.data.list);
|
curr = list_entry (entry, struct pthread, header.data.list);
|
||||||
if (FREE_P (curr) && curr->stackblock_size >= size)
|
if (FREE_P (curr) && curr->stackblock_size >= size)
|
||||||
{
|
{
|
||||||
if (curr->stackblock_size == size)
|
if (curr->stackblock_size == size)
|
||||||
|
@ -56,54 +56,59 @@ extern int __lll_mutex_unlock_wait (int *__futex)
|
|||||||
({ unsigned char ret; \
|
({ unsigned char ret; \
|
||||||
__asm __volatile (LOCK_INSTR "cmpxchgl %2, %1; setne %0" \
|
__asm __volatile (LOCK_INSTR "cmpxchgl %2, %1; setne %0" \
|
||||||
: "=a" (ret), "=m" (futex) \
|
: "=a" (ret), "=m" (futex) \
|
||||||
: "r" (1), "1" (futex), "0" (0)); \
|
: "r" (1), "1" (futex), "0" (0) \
|
||||||
|
: "memory"); \
|
||||||
ret; })
|
ret; })
|
||||||
|
|
||||||
|
|
||||||
#define lll_mutex_lock(futex) \
|
#define lll_mutex_lock(futex) \
|
||||||
(void) ({ int ignore1, ignore2; \
|
(void) ({ int ignore1, ignore2; \
|
||||||
__asm (LOCK_INSTR "xaddl %0, %2\n\t" \
|
__asm __volatile (LOCK_INSTR "xaddl %0, %2\n\t" \
|
||||||
"testl %0, %0\n\t" \
|
"testl %0, %0\n\t" \
|
||||||
"jne 1f\n\t" \
|
"jne 1f\n\t" \
|
||||||
".subsection 1\n" \
|
".subsection 1\n" \
|
||||||
"1:\tleal %2, %%ecx\n\t" \
|
"1:\tleal %2, %%ecx\n\t" \
|
||||||
"call __lll_mutex_lock_wait\n\t" \
|
"call __lll_mutex_lock_wait\n\t" \
|
||||||
"jmp 2f\n\t" \
|
"jmp 2f\n\t" \
|
||||||
".previous\n" \
|
".previous\n" \
|
||||||
"2:" \
|
"2:" \
|
||||||
: "=a" (ignore1), "=&c" (ignore2), "=m" (futex) \
|
: "=a" (ignore1), "=&c" (ignore2), "=m" (futex) \
|
||||||
: "0" (1), "2" (futex)); })
|
: "0" (1), "2" (futex) \
|
||||||
|
: "memory"); })
|
||||||
|
|
||||||
|
|
||||||
#define lll_mutex_timedlock(futex, timeout) \
|
#define lll_mutex_timedlock(futex, timeout) \
|
||||||
({ int result, ignore1, ignore2; \
|
({ int result, ignore1, ignore2; \
|
||||||
__asm (LOCK_INSTR "xaddl %0, %3\n\t" \
|
__asm __volatile (LOCK_INSTR "xaddl %0, %3\n\t" \
|
||||||
"testl %0, %0\n\t" \
|
"testl %0, %0\n\t" \
|
||||||
"jne 1f\n\t" \
|
"jne 1f\n\t" \
|
||||||
".subsection 1\n" \
|
".subsection 1\n" \
|
||||||
"1:\tleal %3, %%ecx\n\t" \
|
"1:\tleal %3, %%ecx\n\t" \
|
||||||
"movl %6, %%edx\n\t" \
|
"movl %6, %%edx\n\t" \
|
||||||
"call __lll_mutex_timedlock_wait\n\t" \
|
"call __lll_mutex_timedlock_wait\n\t" \
|
||||||
"jmp 2f\n\t" \
|
"jmp 2f\n\t" \
|
||||||
".previous\n" \
|
".previous\n" \
|
||||||
"2:" \
|
"2:" \
|
||||||
: "=a" (result), "=&c" (ignore1), "=&d" (ignore2), "=m" (futex) \
|
: "=a" (result), "=&c" (ignore1), "=&d" (ignore2), \
|
||||||
: "0" (1), "3" (futex), "m" (timeout)); \
|
"=m" (futex) \
|
||||||
|
: "0" (1), "3" (futex), "m" (timeout) \
|
||||||
|
: "memory"); \
|
||||||
result; })
|
result; })
|
||||||
|
|
||||||
|
|
||||||
#define lll_mutex_unlock(futex) \
|
#define lll_mutex_unlock(futex) \
|
||||||
(void) ({ int ignore; \
|
(void) ({ int ignore; \
|
||||||
__asm (LOCK_INSTR "decl %0\n\t" \
|
__asm __volatile (LOCK_INSTR "decl %0\n\t" \
|
||||||
"jne 1f\n\t" \
|
"jne 1f\n\t" \
|
||||||
".subsection 1\n" \
|
".subsection 1\n" \
|
||||||
"1:\tleal %0, %%eax\n\t" \
|
"1:\tleal %0, %%eax\n\t" \
|
||||||
"call __lll_mutex_unlock_wake\n\t" \
|
"call __lll_mutex_unlock_wake\n\t" \
|
||||||
"jmp 2f\n\t" \
|
"jmp 2f\n\t" \
|
||||||
".previous\n" \
|
".previous\n" \
|
||||||
"2:" \
|
"2:" \
|
||||||
: "=m" (futex), "=&a" (ignore) \
|
: "=m" (futex), "=&a" (ignore) \
|
||||||
: "0" (futex)); })
|
: "0" (futex) \
|
||||||
|
: "memory"); })
|
||||||
|
|
||||||
|
|
||||||
#define lll_mutex_islocked(futex) \
|
#define lll_mutex_islocked(futex) \
|
||||||
@ -138,36 +143,39 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
|
|||||||
({ unsigned char ret; \
|
({ unsigned char ret; \
|
||||||
__asm __volatile (LOCK_INSTR "cmpxchgl %2, %1; setne %0" \
|
__asm __volatile (LOCK_INSTR "cmpxchgl %2, %1; setne %0" \
|
||||||
: "=a" (ret), "=m" (futex) \
|
: "=a" (ret), "=m" (futex) \
|
||||||
: "r" (0), "1" (futex), "0" (1)); \
|
: "r" (0), "1" (futex), "0" (1) \
|
||||||
|
: "memory"); \
|
||||||
ret; })
|
ret; })
|
||||||
|
|
||||||
|
|
||||||
#define lll_lock(futex) \
|
#define lll_lock(futex) \
|
||||||
(void) ({ int ignore1, ignore2; \
|
(void) ({ int ignore1, ignore2; \
|
||||||
__asm (LOCK_INSTR "xaddl %0, %2\n\t" \
|
__asm __volatile (LOCK_INSTR "xaddl %0, %2\n\t" \
|
||||||
"jne 1f\n\t" \
|
"jne 1f\n\t" \
|
||||||
".subsection 1\n" \
|
".subsection 1\n" \
|
||||||
"1:\tleal %2, %%ecx\n\t" \
|
"1:\tleal %2, %%ecx\n\t" \
|
||||||
"call __lll_lock_wait\n\t" \
|
"call __lll_lock_wait\n\t" \
|
||||||
"jmp 2f\n\t" \
|
"jmp 2f\n\t" \
|
||||||
".previous\n" \
|
".previous\n" \
|
||||||
"2:" \
|
"2:" \
|
||||||
: "=a" (ignore1), "=&c" (ignore2), "=m" (futex) \
|
: "=a" (ignore1), "=&c" (ignore2), "=m" (futex) \
|
||||||
: "0" (-1), "2" (futex)); })
|
: "0" (-1), "2" (futex) \
|
||||||
|
: "memory"); })
|
||||||
|
|
||||||
|
|
||||||
#define lll_unlock(futex) \
|
#define lll_unlock(futex) \
|
||||||
(void) ({ int ignore; \
|
(void) ({ int ignore; \
|
||||||
__asm (LOCK_INSTR "incl %0\n\t" \
|
__asm __volatile (LOCK_INSTR "incl %0\n\t" \
|
||||||
"jng 1f\n\t" \
|
"jng 1f\n\t" \
|
||||||
".subsection 1\n" \
|
".subsection 1\n" \
|
||||||
"1:\tleal %0, %%eax\n\t" \
|
"1:\tleal %0, %%eax\n\t" \
|
||||||
"call __lll_unlock_wake\n\t" \
|
"call __lll_unlock_wake\n\t" \
|
||||||
"jmp 2f\n\t" \
|
"jmp 2f\n\t" \
|
||||||
".previous\n" \
|
".previous\n" \
|
||||||
"2:" \
|
"2:" \
|
||||||
: "=m" (futex), "=&a" (ignore) \
|
: "=m" (futex), "=&a" (ignore) \
|
||||||
: "0" (futex)); })
|
: "0" (futex) \
|
||||||
|
: "memory"); })
|
||||||
|
|
||||||
|
|
||||||
#define lll_islocked(futex) \
|
#define lll_islocked(futex) \
|
||||||
|
Loading…
Reference in New Issue
Block a user