mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 11:43:34 +08:00
Update.
2002-12-18 Ulrich Drepper <drepper@redhat.com> * sysdeps/pthread/bits/stdio-lock.h: New file. * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: New file. * sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S: New file. * sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S: New file. * Makefile (routines): Add libc-lowlevelmutex. * sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Remove __i686.get_pc_thunk.dx.
This commit is contained in:
parent
6ed5da8f48
commit
d7913e0e25
@ -1,3 +1,14 @@
|
||||
2002-12-18 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/pthread/bits/stdio-lock.h: New file.
|
||||
* sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S: New file.
|
||||
* sysdeps/unix/sysv/linux/i386/i586/libc-lowlevelmutex.S: New file.
|
||||
* sysdeps/unix/sysv/linux/i386/i686/libc-lowlevelmutex.S: New file.
|
||||
* Makefile (routines): Add libc-lowlevelmutex.
|
||||
|
||||
* sysdeps/unix/sysv/linux/i386/i486/libc-lowlevellock.S: Remove
|
||||
__i686.get_pc_thunk.dx.
|
||||
|
||||
2002-12-17 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* Makefile (libpthread-shared-only-routines): Add pt-allocrtsig.
|
||||
|
@ -28,7 +28,8 @@ headers := pthread.h semaphore.h
|
||||
extra-libs := libpthread
|
||||
extra-libs-others := $(extra-libs)
|
||||
|
||||
routines = alloca_cutoff forward libc-lowlevellock libc-cancellation
|
||||
routines = alloca_cutoff forward libc-lowlevellock libc-lowlevelmutex \
|
||||
libc-cancellation
|
||||
shared-only-routines = forward
|
||||
|
||||
libpthread-routines = init events \
|
||||
|
86
nptl/sysdeps/pthread/bits/stdio-lock.h
Normal file
86
nptl/sysdeps/pthread/bits/stdio-lock.h
Normal file
@ -0,0 +1,86 @@
|
||||
/* Thread package specific definitions of stream lock type. Generic version.
|
||||
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
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. */
|
||||
|
||||
#ifndef _BITS_STDIO_LOCK_H
|
||||
#define _BITS_STDIO_LOCK_H 1
|
||||
|
||||
#include <bits/libc-lock.h>
|
||||
#include <lowlevellock.h>
|
||||
|
||||
|
||||
typedef struct { int lock; int cnt; void *owner; } _IO_lock_t;
|
||||
|
||||
#define _IO_lock_initializer { LLL_MUTEX_LOCK_INITIALIZER, 0, NULL }
|
||||
|
||||
#define _IO_lock_init(_name) \
|
||||
((_name) = (_IO_lock_t) _IO_lock_initializer , 0)
|
||||
|
||||
#define _IO_lock_fini(_name) \
|
||||
((void) 0)
|
||||
|
||||
#define _IO_lock_lock(_name) \
|
||||
do { \
|
||||
void *__self = THREAD_SELF; \
|
||||
if ((_name).owner != __self) \
|
||||
{ \
|
||||
lll_mutex_lock ((_name).lock); \
|
||||
(_name).owner = __self; \
|
||||
} \
|
||||
++(_name).cnt; \
|
||||
} while (0)
|
||||
|
||||
#define _IO_lock_trylock(_name) \
|
||||
({ \
|
||||
int __result = 0; \
|
||||
void *__self = THREAD_SELF; \
|
||||
if ((_name).owner != __self) \
|
||||
{ \
|
||||
if (lll_mutex_trylock ((_name).lock) == 0) \
|
||||
{ \
|
||||
(_name).owner = __self; \
|
||||
(_name).cnt = 1; \
|
||||
} \
|
||||
else \
|
||||
__result = EBUSY; \
|
||||
} \
|
||||
else \
|
||||
++(_name).cnt; \
|
||||
__result; \
|
||||
})
|
||||
|
||||
#define _IO_lock_unlock(_name) \
|
||||
do { \
|
||||
if (--(_name).cnt == 0) \
|
||||
{ \
|
||||
(_name).owner = NULL; \
|
||||
lll_mutex_unlock ((_name).lock); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
||||
#define _IO_cleanup_region_start(_fct, _fp) \
|
||||
__libc_cleanup_region_start (((_fp)->_flags & _IO_USER_LOCK) == 0, _fct, _fp)
|
||||
#define _IO_cleanup_region_start_noarg(_fct) \
|
||||
__libc_cleanup_region_start (1, _fct, NULL)
|
||||
#define _IO_cleanup_region_end(_doit) \
|
||||
__libc_cleanup_region_end (_doit)
|
||||
|
||||
|
||||
#endif /* bits/stdio-lock.h */
|
@ -183,13 +183,3 @@ __lll_timedwait_tid:
|
||||
6: movl $ETIMEDOUT, %eax
|
||||
jmp 3b
|
||||
.size __lll_timedwait_tid,.-__lll_timedwait_tid
|
||||
|
||||
|
||||
.section .gnu.linkonce.t.__i686.get_pc_thunk.dx,"ax",@progbits
|
||||
.globl __i686.get_pc_thunk.dx
|
||||
.hidden __i686.get_pc_thunk.dx
|
||||
.type __i686.get_pc_thunk.dx,@function
|
||||
__i686.get_pc_thunk.dx:
|
||||
movl (%esp), %edx
|
||||
ret
|
||||
.size __i686.get_pc_thunk.dx,.-__i686.get_pc_thunk.dx
|
||||
|
180
nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S
Normal file
180
nptl/sysdeps/unix/sysv/linux/i386/i486/libc-lowlevelmutex.S
Normal file
@ -0,0 +1,180 @@
|
||||
/* Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
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 <sysdep.h>
|
||||
|
||||
.text
|
||||
|
||||
#define SYS_gettimeofday __NR_gettimeofday
|
||||
#define SYS_futex 240
|
||||
#define FUTEX_WAIT 0
|
||||
#define FUTEX_WAKE 1
|
||||
|
||||
#define EWOULDBLOCK 11
|
||||
#define EINVAL 22
|
||||
#define ETIMEDOUT 110
|
||||
|
||||
|
||||
.globl __lll_mutex_lock_wait
|
||||
.type __lll_mutex_lock_wait,@function
|
||||
.hidden __lll_mutex_lock_wait
|
||||
.align 16
|
||||
__lll_mutex_lock_wait:
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %edx
|
||||
|
||||
movl %ecx, %ebx
|
||||
xorl %esi, %esi /* No timeout. */
|
||||
xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
|
||||
1:
|
||||
leal 1(%eax), %edx /* account for the preceeded xadd. */
|
||||
movl $SYS_futex, %eax
|
||||
int $0x80
|
||||
|
||||
movl $1, %eax
|
||||
#ifndef UP
|
||||
cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
|
||||
je,pt 0f
|
||||
lock
|
||||
0:
|
||||
#endif
|
||||
xaddl %eax, (%ebx)
|
||||
testl %eax, %eax
|
||||
jne 1b
|
||||
|
||||
movl $2, (%ebx)
|
||||
|
||||
popl %edx
|
||||
popl %ebx
|
||||
popl %esi
|
||||
ret
|
||||
.size __lll_mutex_lock_wait,.-__lll_mutex_lock_wait
|
||||
|
||||
|
||||
.globl __lll_mutex_timedlock_wait
|
||||
.type __lll_mutex_timedlock_wait,@function
|
||||
.hidden __lll_mutex_timedlock_wait
|
||||
.align 16
|
||||
__lll_mutex_timedlock_wait:
|
||||
/* Check for a valid timeout value. */
|
||||
cmpl $1000000000, 4(%edx)
|
||||
jae 3f
|
||||
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %ebp
|
||||
|
||||
/* Stack frame for the timespec and timeval structs. */
|
||||
subl $8, %esp
|
||||
|
||||
movl %ecx, %ebp
|
||||
movl %edx, %edi
|
||||
leal 1(%eax), %esi
|
||||
|
||||
/* Get current time. */
|
||||
1:
|
||||
movl %esp, %ebx
|
||||
xorl %ecx, %ecx
|
||||
movl $SYS_gettimeofday, %eax
|
||||
int $0x80
|
||||
|
||||
/* Compute relative timeout. */
|
||||
movl 4(%esp), %eax
|
||||
movl $1000, %edx
|
||||
mul %edx /* Milli seconds to nano seconds. */
|
||||
movl (%edi), %ecx
|
||||
movl 4(%edi), %edx
|
||||
subl (%esp), %ecx
|
||||
subl %eax, %edx
|
||||
jns 4f
|
||||
addl $1000000000, %edx
|
||||
decl %ecx
|
||||
4: testl %ecx, %ecx
|
||||
js 5f /* Time is already up. */
|
||||
|
||||
/* Futex call. */
|
||||
movl %ecx, (%esp) /* Store relative timeout. */
|
||||
movl %edx, 4(%esp)
|
||||
movl %esi, %edx
|
||||
movl %esp, %esi
|
||||
xorl %ecx, %ecx /* movl $FUTEX_WAIT, %ecx */
|
||||
movl %ebp, %ebx
|
||||
movl $SYS_futex, %eax
|
||||
int $0x80
|
||||
|
||||
movl $1, %esi
|
||||
#ifndef UP
|
||||
cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
|
||||
je,pt 0f
|
||||
lock
|
||||
0:
|
||||
#endif
|
||||
xaddl %esi, (%ebx)
|
||||
testl %esi, %esi
|
||||
jne 7f
|
||||
|
||||
movl $2, (%ebx)
|
||||
xorl %eax, %eax
|
||||
|
||||
6: addl $8, %esp
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
/* Check whether the time expired. */
|
||||
7: cmpl $-ETIMEDOUT, %eax
|
||||
je 5f
|
||||
jmp 1b
|
||||
|
||||
3: movl $EINVAL, %eax
|
||||
ret
|
||||
|
||||
5: movl $ETIMEDOUT, %eax
|
||||
jmp 6b
|
||||
.size __lll_mutex_timedlock_wait,.-__lll_mutex_timedlock_wait
|
||||
|
||||
|
||||
.globl __lll_mutex_unlock_wake
|
||||
.type __lll_mutex_unlock_wake,@function
|
||||
.hidden __lll_mutex_unlock_wake
|
||||
.align 16
|
||||
__lll_mutex_unlock_wake:
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
|
||||
movl $FUTEX_WAKE, %ecx
|
||||
movl %eax, %ebx
|
||||
xorl %esi, %esi
|
||||
movl $0, (%ebx)
|
||||
movl $1, %edx /* Wake one thread. */
|
||||
movl $SYS_futex, %eax
|
||||
int $0x80
|
||||
|
||||
popl %edx
|
||||
popl %ecx
|
||||
popl %ebx
|
||||
popl %esi
|
||||
ret
|
||||
.size __lll_mutex_unlock_wake,.-__lll_mutex_unlock_wake
|
@ -0,0 +1 @@
|
||||
#include "../i486/libc-lowlevelmutex.S"
|
@ -0,0 +1 @@
|
||||
#include "../i486/libc-lowlevelmutex.S"
|
Loading…
Reference in New Issue
Block a user