diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2006-01-04 03:45:56 +0000 | 
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2006-01-04 03:45:56 +0000 | 
| commit | e9264e49f3777c298e8a734cf4483c26b2602584 (patch) | |
| tree | bc99d793d97a1d73bc55a256f6983c5d26fcc925 /libpthread/linuxthreads.old/sysdeps | |
| parent | cd662e64be1b10615e2fb44d5f3dc97eca905a31 (diff) | |
| download | uClibc-alpine-e9264e49f3777c298e8a734cf4483c26b2602584.tar.bz2 uClibc-alpine-e9264e49f3777c298e8a734cf4483c26b2602584.tar.xz | |
update pthread weak handling to the style glibc uses
Diffstat (limited to 'libpthread/linuxthreads.old/sysdeps')
| -rw-r--r-- | libpthread/linuxthreads.old/sysdeps/pthread/bits/libc-tsd.h | 36 | ||||
| -rw-r--r-- | libpthread/linuxthreads.old/sysdeps/pthread/pthread-functions.h | 95 | 
2 files changed, 117 insertions, 14 deletions
| diff --git a/libpthread/linuxthreads.old/sysdeps/pthread/bits/libc-tsd.h b/libpthread/linuxthreads.old/sysdeps/pthread/bits/libc-tsd.h index 58b986a49..fc8388ab8 100644 --- a/libpthread/linuxthreads.old/sysdeps/pthread/bits/libc-tsd.h +++ b/libpthread/linuxthreads.old/sysdeps/pthread/bits/libc-tsd.h @@ -35,6 +35,8 @@ enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,  #include <sys/cdefs.h>  #include <tls.h> +#include <linuxthreads.old/internals.h> +  #if USE_TLS && HAVE___THREAD  /* When __thread works, the generic definition is what we want.  */ @@ -42,25 +44,31 @@ enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,  #else -extern void *(*__libc_internal_tsd_get) (enum __libc_tsd_key_t); -extern int (*__libc_internal_tsd_set) (enum __libc_tsd_key_t, __const void *); -extern void **(*const __libc_internal_tsd_address) (enum __libc_tsd_key_t) -     __attribute__ ((__const__)); +# ifndef SHARED +extern void ** __pthread_internal_tsd_address (int); +extern void *__pthread_internal_tsd_get (int); +extern int __pthread_internal_tsd_set (int, const void *); -#define __libc_tsd_address(KEY) \ -  (__libc_internal_tsd_address != NULL \ -   ? __libc_internal_tsd_address (_LIBC_TSD_KEY_##KEY) \ -   : &__libc_tsd_##KEY##_data) +weak_extern (__pthread_internal_tsd_address) +weak_extern (__pthread_internal_tsd_get) +weak_extern (__pthread_internal_tsd_set) +# endif + +#define __libc_maybe_call2(FUNC, ARGS, ELSE) \ +  ({__builtin_expect (__libc_pthread_functions.ptr_##FUNC != NULL, 0) \ +    ? __libc_pthread_functions.ptr_##FUNC ARGS : ELSE; })  #define __libc_tsd_define(CLASS, KEY)	CLASS void *__libc_tsd_##KEY##_data; +#define __libc_tsd_address(KEY) \ +  __libc_maybe_call2 (pthread_internal_tsd_address,			\ +		      (_LIBC_TSD_KEY_##KEY), &__libc_tsd_##KEY##_data)  #define __libc_tsd_get(KEY) \ -  (__libc_internal_tsd_get != NULL \ -   ? __libc_internal_tsd_get (_LIBC_TSD_KEY_##KEY) \ -   : __libc_tsd_##KEY##_data) +  __libc_maybe_call2 (pthread_internal_tsd_get,				\ +		      (_LIBC_TSD_KEY_##KEY), __libc_tsd_##KEY##_data)  #define __libc_tsd_set(KEY, VALUE) \ -  (__libc_internal_tsd_set != NULL \ -   ? __libc_internal_tsd_set (_LIBC_TSD_KEY_##KEY, (VALUE)) \ -   : ((__libc_tsd_##KEY##_data = (VALUE)), 0)) +  __libc_maybe_call2 (pthread_internal_tsd_set,				\ +		      (_LIBC_TSD_KEY_##KEY, (VALUE)),			\ +		       (__libc_tsd_##KEY##_data = (VALUE), 0))  #endif diff --git a/libpthread/linuxthreads.old/sysdeps/pthread/pthread-functions.h b/libpthread/linuxthreads.old/sysdeps/pthread/pthread-functions.h new file mode 100644 index 000000000..846dc425b --- /dev/null +++ b/libpthread/linuxthreads.old/sysdeps/pthread/pthread-functions.h @@ -0,0 +1,95 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003. + +   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 _PTHREAD_FUNCTIONS_H +#define _PTHREAD_FUNCTIONS_H	1 + +#include <pthread.h> +#include <setjmp.h> +#include <linuxthreads.old/internals.h> + +struct fork_block; + +/* Data type shared with libc.  The libc uses it to pass on calls to +   the thread functions.  Wine pokes directly into this structure, +   so if possible avoid breaking it and append new hooks to the end.  */ +struct pthread_functions +{ +  pid_t (*ptr_pthread_fork) (struct fork_block *); +  int (*ptr_pthread_attr_destroy) (pthread_attr_t *); +  int (*ptr_pthread_attr_init) (pthread_attr_t *); +  int (*ptr_pthread_attr_getdetachstate) (const pthread_attr_t *, int *); +  int (*ptr_pthread_attr_setdetachstate) (pthread_attr_t *, int); +  int (*ptr_pthread_attr_getinheritsched) (const pthread_attr_t *, int *); +  int (*ptr_pthread_attr_setinheritsched) (pthread_attr_t *, int); +  int (*ptr_pthread_attr_getschedparam) (const pthread_attr_t *, +					 struct sched_param *); +  int (*ptr_pthread_attr_setschedparam) (pthread_attr_t *, +					 const struct sched_param *); +  int (*ptr_pthread_attr_getschedpolicy) (const pthread_attr_t *, int *); +  int (*ptr_pthread_attr_setschedpolicy) (pthread_attr_t *, int); +  int (*ptr_pthread_attr_getscope) (const pthread_attr_t *, int *); +  int (*ptr_pthread_attr_setscope) (pthread_attr_t *, int); +  int (*ptr_pthread_condattr_destroy) (pthread_condattr_t *); +  int (*ptr_pthread_condattr_init) (pthread_condattr_t *); +  int (*ptr_pthread_cond_broadcast) (pthread_cond_t *); +  int (*ptr_pthread_cond_destroy) (pthread_cond_t *); +  int (*ptr_pthread_cond_init) (pthread_cond_t *, +				  const pthread_condattr_t *); +  int (*ptr_pthread_cond_signal) (pthread_cond_t *); +  int (*ptr_pthread_cond_wait) (pthread_cond_t *, pthread_mutex_t *); +  int (*ptr_pthread_equal) (pthread_t, pthread_t); +  void (*ptr___pthread_exit) (void *); +  int (*ptr_pthread_getschedparam) (pthread_t, int *, struct sched_param *); +  int (*ptr_pthread_setschedparam) (pthread_t, int, +				    const struct sched_param *); +  int (*ptr_pthread_mutex_destroy) (pthread_mutex_t *); +  int (*ptr_pthread_mutex_init) (pthread_mutex_t *, +				 const pthread_mutexattr_t *); +  int (*ptr_pthread_mutex_lock) (pthread_mutex_t *); +  int (*ptr_pthread_mutex_trylock) (pthread_mutex_t *); +  int (*ptr_pthread_mutex_unlock) (pthread_mutex_t *); +  pthread_t (*ptr_pthread_self) (void); +  int (*ptr_pthread_setcancelstate) (int, int *); +  int (*ptr_pthread_setcanceltype) (int, int *); +  void (*ptr_pthread_do_exit) (void *retval, char *currentframe); +  void (*ptr_pthread_cleanup_upto) (__jmp_buf target, +				    char *targetframe); +  pthread_descr (*ptr_pthread_thread_self) (void); +  int (*ptr_pthread_internal_tsd_set) (int key, const void *pointer); +  void * (*ptr_pthread_internal_tsd_get) (int key); +  void ** __attribute__ ((__const__)) +    (*ptr_pthread_internal_tsd_address) (int key); +  int (*ptr_pthread_sigaction) (int sig, const struct sigaction * act, +				struct sigaction *oact); +  int (*ptr_pthread_sigwait) (const sigset_t *set, int *sig); +  int (*ptr_pthread_raise) (int sig); +  int (*ptr_pthread_cond_timedwait) (pthread_cond_t *, pthread_mutex_t *, +				       const struct timespec *); +  void (*ptr__pthread_cleanup_push) (struct _pthread_cleanup_buffer * buffer, +				     void (*routine)(void *), void * arg); + +  void (*ptr__pthread_cleanup_pop) (struct _pthread_cleanup_buffer * buffer, +				    int execute); +}; + +/* Variable in libc.so.  */ +extern struct pthread_functions __libc_pthread_functions attribute_hidden; + +#endif	/* pthread-functions.h */ | 
