1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
2002-12-07  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/generic/bits/stdio-lock.h (_IO_lock_trylock): New define.
This commit is contained in:
Ulrich Drepper
2002-12-08 03:13:06 +00:00
parent 6ccb3834eb
commit 09efc3ba12
20 changed files with 101 additions and 28 deletions

View File

@ -1,3 +1,7 @@
2002-12-07 Ulrich Drepper <drepper@redhat.com>
* sysdeps/generic/bits/stdio-lock.h (_IO_lock_trylock): New define.
2002-12-07 Roland McGrath <roland@redhat.com> 2002-12-07 Roland McGrath <roland@redhat.com>
* sysdeps/generic/libc-tls.c (__libc_setup_tls): Reintroduce changes * sysdeps/generic/libc-tls.c (__libc_setup_tls): Reintroduce changes

View File

@ -1,5 +1,5 @@
/* Thread package specific definitions of stream lock type. Generic version. /* Thread package specific definitions of stream lock type. Generic version.
Copyright (C) 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -34,6 +34,7 @@ __libc_lock_define_recursive (typedef, _IO_lock_t)
#define _IO_lock_init(_name) __libc_lock_init_recursive (_name) #define _IO_lock_init(_name) __libc_lock_init_recursive (_name)
#define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name) #define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name)
#define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name) #define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name)
#define _IO_lock_trylock(_name) __libc_lock_trylock_recursive (_name)
#define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name) #define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name)

View File

@ -1 +1 @@
nptl 0.11 by Ulrich Drepper nptl 0.12 by Ulrich Drepper

View File

@ -1,5 +1,46 @@
2002-12-07 Ulrich Drepper <drepper@redhat.com> 2002-12-07 Ulrich Drepper <drepper@redhat.com>
* Makefile (CFLAGS-ftrylockfile.c): Add -D_IO_MTSAFE_IO.
* cleanup.c: Move declarations of _GI_pthread_cleanup_push and
_GI_pthread_cleanup_pop to pthreadP.h.
* ftrylockfile.c: Use _IO_lock_trylock instead of
pthread_mutex_trylock.
* pthreadP.h (CANCEL_ASYNC): Use __pthread_setcanceltype.
(CANCEL_RESET): Likewise.
(__pthread_setcanceltype_): Declare.
(__pthread_mutex_lock_internal): Declare.
(__pthread_mutex_unlock_internal): Declare.
(__pthread_once_internal): Declare.
(pthread_cleanup_push): Redefine using _GI_pthread_cleanup_push.
(pthread_cleanup_pop): Redefine using _GI_pthread_cleanup_pop.
* pthread_cond_timedwait.c: Use INTUSE is calls to pthread_mutex_lock
and pthread_mutex_unlock.
* pthread_cond_wait.c: Likewise.
* pthread_mutex_lock.c: Use INTDEF to define alias if needed.
* pthread_mutex_unlock.c: Likewise.
* pthread_setcanceltype.c: Add additional alias
__pthread_setcanceltype.
* sem_unlink.c (sem_unlink): Use __pthread_once with INTDEF.
* sem_open.c (sem_open): Likewise.
Use __libc_open, __libc_write, and __libc_close instead of
open, write, and close respectively.
* sysdeps/pthread/bits/libc-lock.h (__libc_lock_trylock_internal):
Rewrite as statement expression since it must return a value.
* pthread_cancel.c: Use __pthread_kill instead of pthread_kill.
* sysdeps/unix/sysv/linux/pthread_kill.c: Define additional alias
__pthread_kill.
* sysdeps/unix/sysv/linux/i386/pthread_once.S: Define additional
alias __pthread_once_internal.
* sysdeps/unix/sysv/linux/raise.c: Use libc_hidden_def for raise. * sysdeps/unix/sysv/linux/raise.c: Use libc_hidden_def for raise.
2002-12-06 Ulrich Drepper <drepper@redhat.com> 2002-12-06 Ulrich Drepper <drepper@redhat.com>

View File

@ -157,6 +157,7 @@ CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions
endif endif
CFLAGS-flockfile.c = -D_IO_MTSAFE_IO CFLAGS-flockfile.c = -D_IO_MTSAFE_IO
CFLAGS-ftrylockfile.c = -D_IO_MTSAFE_IO
CFLAGS-funlockfile.c = -D_IO_MTSAFE_IO CFLAGS-funlockfile.c = -D_IO_MTSAFE_IO
ifeq ($(build-static),yes) ifeq ($(build-static),yes)

View File

@ -38,9 +38,6 @@ _pthread_cleanup_push (buffer, routine, arg)
THREAD_SETMEM (self, cleanup, buffer); THREAD_SETMEM (self, cleanup, buffer);
} }
extern void _GI_pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
void (*routine) (void *), void *arg)
attribute_hidden;
strong_alias (_pthread_cleanup_push, _GI_pthread_cleanup_push) strong_alias (_pthread_cleanup_push, _GI_pthread_cleanup_push)
@ -58,6 +55,4 @@ _pthread_cleanup_pop (buffer, execute)
if (execute) if (execute)
buffer->__routine (buffer->__arg); buffer->__routine (buffer->__arg);
} }
extern void _GI_pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
int execute) attribute_hidden;
strong_alias (_pthread_cleanup_pop, _GI_pthread_cleanup_pop) strong_alias (_pthread_cleanup_pop, _GI_pthread_cleanup_pop)

View File

@ -17,15 +17,16 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ 02111-1307 USA. */
#include <errno.h>
#include <pthread.h> #include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <libio.h> #include <bits/stdio-lock.h>
int int
ftrylockfile (stream) ftrylockfile (stream)
FILE *stream; FILE *stream;
{ {
return pthread_mutex_trylock (stream->_lock); return _IO_lock_trylock (*stream->_lock);
} }
strong_alias (ftrylockfile, _IO_ftrylockfile) strong_alias (ftrylockfile, _IO_ftrylockfile)

View File

@ -80,10 +80,10 @@ extern int __pthread_debug attribute_hidden;
/* Set cancellation mode to asynchronous. */ /* Set cancellation mode to asynchronous. */
#define CANCEL_ASYNC(oldtype) \ #define CANCEL_ASYNC(oldtype) \
pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype) __pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype)
/* Reset to previous cancellation mode. */ /* Reset to previous cancellation mode. */
#define CANCEL_RESET(oldtype) \ #define CANCEL_RESET(oldtype) \
pthread_setcanceltype (oldtype, NULL) __pthread_setcanceltype (oldtype, NULL)
/* Function performing the cancellation. */ /* Function performing the cancellation. */
extern void __do_cancel (char *currentframe) extern void __do_cancel (char *currentframe)
@ -147,7 +147,9 @@ extern int __pthread_mutex_init (pthread_mutex_t *__mutex,
extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex); extern int __pthread_mutex_destroy (pthread_mutex_t *__mutex);
extern int __pthread_mutex_trylock (pthread_mutex_t *_mutex); extern int __pthread_mutex_trylock (pthread_mutex_t *_mutex);
extern int __pthread_mutex_lock (pthread_mutex_t *__mutex); extern int __pthread_mutex_lock (pthread_mutex_t *__mutex);
extern int __pthread_mutex_lock_internal (pthread_mutex_t *__mutex);
extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex); extern int __pthread_mutex_unlock (pthread_mutex_t *__mutex);
extern int __pthread_mutex_unlock_internal (pthread_mutex_t *__mutex);
extern int __pthread_mutexattr_init (pthread_mutexattr_t *attr); extern int __pthread_mutexattr_init (pthread_mutexattr_t *attr);
extern int __pthread_mutexattr_destroy (pthread_mutexattr_t *attr); extern int __pthread_mutexattr_destroy (pthread_mutexattr_t *attr);
extern int __pthread_mutexattr_settype (pthread_mutexattr_t *attr, int kind); extern int __pthread_mutexattr_settype (pthread_mutexattr_t *attr, int kind);
@ -179,7 +181,26 @@ extern void *__pthread_getspecific (pthread_key_t key);
extern int __pthread_setspecific (pthread_key_t key, const void *value); extern int __pthread_setspecific (pthread_key_t key, const void *value);
extern int __pthread_once (pthread_once_t *once_control, extern int __pthread_once (pthread_once_t *once_control,
void (*init_routine) (void)); void (*init_routine) (void));
extern int __pthread_once_internal (pthread_once_t *once_control,
void (*init_routine) (void));
extern int __pthread_atfork (void (*prepare) (void), void (*parent) (void), extern int __pthread_atfork (void (*prepare) (void), void (*parent) (void),
void (*child) (void)); void (*child) (void));
extern int __pthread_kill (pthread_t threadid, int signo);
extern int __pthread_setcanceltype (int type, int *oldtype);
/* Special versions which use non-exported functions. */
extern void _GI_pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
void (*routine) (void *), void *arg)
attribute_hidden;
#undef pthread_cleanup_push
#define pthread_cleanup_push(routine,arg) \
{ struct _pthread_cleanup_buffer _buffer; \
_GI_pthread_cleanup_push (&_buffer, (routine), (arg));
extern void _GI_pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
int execute) attribute_hidden;
#undef pthread_cleanup_pop
#define pthread_cleanup_pop(execute) \
_GI_pthread_cleanup_pop (&_buffer, (execute)); }
#endif /* pthreadP.h */ #endif /* pthreadP.h */

View File

@ -46,7 +46,7 @@ pthread_cancel (th)
{ {
/* The cancellation handler will take care of marking the /* The cancellation handler will take care of marking the
thread as canceled. */ thread as canceled. */
pthread_kill (th, SIGCANCEL); __pthread_kill (th, SIGCANCEL);
break; break;
} }

View File

@ -40,7 +40,7 @@ pthread_cond_timedwait (cond, mutex, abstime)
lll_mutex_lock (cond->__data.__lock); lll_mutex_lock (cond->__data.__lock);
/* Release the mutex. This might fail. */ /* Release the mutex. This might fail. */
err = pthread_mutex_unlock (mutex); err = INTUSE(__pthread_mutex_unlock) (mutex);
if (__builtin_expect (err != 0, 0)) if (__builtin_expect (err != 0, 0))
{ {
lll_mutex_unlock (cond->__data.__lock); lll_mutex_unlock (cond->__data.__lock);
@ -61,7 +61,7 @@ pthread_cond_timedwait (cond, mutex, abstime)
lll_mutex_unlock (cond->__data.__lock); lll_mutex_unlock (cond->__data.__lock);
/* We have to get the mutex before returning. */ /* We have to get the mutex before returning. */
err = pthread_mutex_lock (mutex); err = INTUSE(__pthread_mutex_lock) (mutex);
if (err != 0) if (err != 0)
/* XXX Unconditionally overwrite the result of the wait? */ /* XXX Unconditionally overwrite the result of the wait? */
result = err; result = err;

View File

@ -36,7 +36,7 @@ pthread_cond_wait (cond, mutex)
lll_mutex_lock (cond->__data.__lock); lll_mutex_lock (cond->__data.__lock);
/* Release the mutex. This might fail. */ /* Release the mutex. This might fail. */
err = pthread_mutex_unlock (mutex); err = INTUSE(__pthread_mutex_unlock) (mutex);
if (__builtin_expect (err != 0, 0)) if (__builtin_expect (err != 0, 0))
{ {
lll_mutex_unlock (cond->__data.__lock); lll_mutex_unlock (cond->__data.__lock);
@ -57,7 +57,7 @@ pthread_cond_wait (cond, mutex)
lll_mutex_unlock (cond->__data.__lock); lll_mutex_unlock (cond->__data.__lock);
/* We have to get the mutex before returning. */ /* We have to get the mutex before returning. */
err = pthread_mutex_lock (mutex); err = INTUSE(__pthread_mutex_lock) (mutex);
/* Cancellation handling. */ /* Cancellation handling. */
CANCELLATION_P (THREAD_SELF); CANCELLATION_P (THREAD_SELF);

View File

@ -75,3 +75,4 @@ __pthread_mutex_lock (mutex)
return 0; return 0;
} }
strong_alias (__pthread_mutex_lock, pthread_mutex_lock) strong_alias (__pthread_mutex_lock, pthread_mutex_lock)
INTDEF(__pthread_mutex_lock)

View File

@ -63,3 +63,4 @@ __pthread_mutex_unlock (mutex)
return 0; return 0;
} }
strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock) strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock)
INTDEF(__pthread_mutex_unlock)

View File

@ -23,7 +23,7 @@
int int
pthread_setcanceltype (type, oldtype) __pthread_setcanceltype (type, oldtype)
int type; int type;
int *oldtype; int *oldtype;
{ {
@ -69,3 +69,4 @@ pthread_setcanceltype (type, oldtype)
return 0; return 0;
} }
strong_alias (__pthread_setcanceltype, pthread_setcanceltype)

View File

@ -131,7 +131,7 @@ sem_open (const char *name, int oflag, ...)
int fd; int fd;
/* Determine where the shmfs is mounted. */ /* Determine where the shmfs is mounted. */
pthread_once (&__namedsem_once, __where_is_shmfs); INTUSE(__pthread_once) (&__namedsem_once, __where_is_shmfs);
/* If we don't know the mount points there is nothing we can do. Ever. */ /* If we don't know the mount points there is nothing we can do. Ever. */
if (mountpoint.dir == NULL) if (mountpoint.dir == NULL)
@ -160,7 +160,7 @@ sem_open (const char *name, int oflag, ...)
/* If the semaphore object has to exist simply open it. */ /* If the semaphore object has to exist simply open it. */
if ((oflag & O_CREAT) == 0) if ((oflag & O_CREAT) == 0)
{ {
fd = open (finalname, oflag | O_NOFOLLOW); fd = __libc_open (finalname, oflag | O_NOFOLLOW);
if (fd == -1) if (fd == -1)
/* Return. errno is already set. */ /* Return. errno is already set. */
@ -210,7 +210,7 @@ sem_open (const char *name, int oflag, ...)
memset ((char *) &initsem + sizeof (struct sem), '\0', memset ((char *) &initsem + sizeof (struct sem), '\0',
sizeof (sem_t) - sizeof (struct sem)); sizeof (sem_t) - sizeof (struct sem));
if (TEMP_FAILURE_RETRY (write (fd, &initsem, sizeof (sem_t))) if (TEMP_FAILURE_RETRY (__libc_write (fd, &initsem, sizeof (sem_t)))
!= sizeof (sem_t) != sizeof (sem_t)
/* Adjust the permission. */ /* Adjust the permission. */
|| fchmod (fd, mode) != 0) || fchmod (fd, mode) != 0)
@ -252,7 +252,7 @@ sem_open (const char *name, int oflag, ...)
} }
/* We don't need the file descriptor anymore. */ /* We don't need the file descriptor anymore. */
close (fd); __libc_close (fd);
return result; return result;
} }

View File

@ -33,7 +33,7 @@ sem_unlink (name)
size_t namelen; size_t namelen;
/* Determine where the shmfs is mounted. */ /* Determine where the shmfs is mounted. */
pthread_once (&__namedsem_once, __where_is_shmfs); INTDEF(__pthread_once) (&__namedsem_once, __where_is_shmfs);
/* If we don't know the mount points there is nothing we can do. Ever. */ /* If we don't know the mount points there is nothing we can do. Ever. */
if (mountpoint.dir == NULL) if (mountpoint.dir == NULL)

View File

@ -1,4 +1,4 @@
/* libc-internal interface for mutex locks. LinuxThreads version. /* libc-internal interface for mutex locks. NPTL version.
Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc. Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -254,8 +254,8 @@ typedef pthread_key_t __libc_key_t;
/* Try to lock the recursive named lock variable. */ /* Try to lock the recursive named lock variable. */
#if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) #if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread)
# define __libc_lock_trylock_recursive(NAME) \ # define __libc_lock_trylock_recursive(NAME) \
do { \ ({ \
int result = 0; \ int result = 0; \
void *self = THREAD_SELF; \ void *self = THREAD_SELF; \
if ((NAME).owner != self) \ if ((NAME).owner != self) \
@ -270,7 +270,8 @@ typedef pthread_key_t __libc_key_t;
} \ } \
else \ else \
++(NAME).cnt; \ ++(NAME).cnt; \
} while (0) result; \
})
#else #else
# define __libc_lock_trylock_recursive(NAME) \ # define __libc_lock_trylock_recursive(NAME) \
__libc_maybe_call (__pthread_mutex_trylock, (&(NAME)), 0) __libc_maybe_call (__pthread_mutex_trylock, (&(NAME)), 0)

View File

@ -134,6 +134,9 @@ __pthread_once:
.size __pthread_once,.-__pthread_once .size __pthread_once,.-__pthread_once
.globl __pthread_once_internal
__pthread_once_internal = __pthread_once
.globl pthread_once .globl pthread_once
pthread_once = __pthread_once pthread_once = __pthread_once

View File

@ -25,7 +25,7 @@
int int
pthread_kill (threadid, signo) __pthread_kill (threadid, signo)
pthread_t threadid; pthread_t threadid;
int signo; int signo;
{ {
@ -34,3 +34,4 @@ pthread_kill (threadid, signo)
/* We have a special syscall to do the work. */ /* We have a special syscall to do the work. */
return INLINE_SYSCALL (tkill, 2, pd->tid, signo); return INLINE_SYSCALL (tkill, 2, pd->tid, signo);
} }
strong_alias (__pthread_kill, pthread_kill)

View File

@ -1,5 +1,5 @@
/* Thread package specific definitions of stream lock type. Generic version. /* Thread package specific definitions of stream lock type. Generic version.
Copyright (C) 2000, 2001 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -34,6 +34,7 @@ __libc_lock_define_recursive (typedef, _IO_lock_t)
#define _IO_lock_init(_name) __libc_lock_init_recursive (_name) #define _IO_lock_init(_name) __libc_lock_init_recursive (_name)
#define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name) #define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name)
#define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name) #define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name)
#define _IO_lock_trylock(_name) __libc_lock_trylock_recursive (_name)
#define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name) #define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name)