diff options
Diffstat (limited to 'libpthread/linuxthreads')
-rw-r--r-- | libpthread/linuxthreads/Makefile | 4 | ||||
-rw-r--r-- | libpthread/linuxthreads/cancel.c | 13 | ||||
-rw-r--r-- | libpthread/linuxthreads/no-tsd.c | 33 | ||||
-rw-r--r-- | libpthread/linuxthreads/specific.c | 5 | ||||
-rw-r--r-- | libpthread/linuxthreads/sysdeps/pthread/bits/libc-tsd.h | 9 |
5 files changed, 23 insertions, 41 deletions
diff --git a/libpthread/linuxthreads/Makefile b/libpthread/linuxthreads/Makefile index 0381a2c53..2c87e3aa2 100644 --- a/libpthread/linuxthreads/Makefile +++ b/libpthread/linuxthreads/Makefile @@ -37,12 +37,12 @@ SYSDEPINC = -I$(PTDIR)sysdeps/unix/sysv/linux \ -I$(PTDIR)sysdeps/$(TARGET_ARCH) \ -I$(PTDIR)sysdeps \ -I$(TOPDIR)libc/sysdeps/linux/$(TARGET_ARCH) -CFLAGS += $(SYSDEPINC) -DLIBPTHREAD_SO="\"libpthread.so.$(MAJOR_VERSION)\"" +CFLAGS += $(SYSDEPINC) CSRC=attr.c cancel.c condvar.c errno.c events.c join.c lockfile.c manager.c \ mutex.c oldsemaphore.c pt-machine.c ptfork.c pthread.c \ ptlongjmp.c rwlock.c semaphore.c signals.c specific.c spinlock.c \ - wrapsyscall.c #weaks.c no-tsd.c + wrapsyscall.c #weaks.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(COBJS) diff --git a/libpthread/linuxthreads/cancel.c b/libpthread/linuxthreads/cancel.c index 8fd8c1e60..42484bb1e 100644 --- a/libpthread/linuxthreads/cancel.c +++ b/libpthread/linuxthreads/cancel.c @@ -14,11 +14,18 @@ /* Thread cancellation */ +#define __FORCE_GLIBC +#include <features.h> #include <errno.h> #include "pthread.h" #include "internals.h" #include "spinlock.h" #include "restart.h" +#ifdef __UCLIBC_HAS_RPC__ +#include <rpc/rpc.h> +extern void __rpc_thread_destroy(void); +#endif + int pthread_setcancelstate(int state, int * oldstate) { @@ -160,6 +167,12 @@ void __pthread_perform_cleanup(void) struct _pthread_cleanup_buffer * c; for (c = THREAD_GETMEM(self, p_cleanup); c != NULL; c = c->__prev) c->__routine(c->__arg); + +#ifdef __UCLIBC_HAS_RPC__ + /* And the TSD which needs special help. */ + if (THREAD_GETMEM(self, p_libc_specific[_LIBC_TSD_KEY_RPC_VARS]) != NULL) + __rpc_thread_destroy (); +#endif } #ifndef PIC diff --git a/libpthread/linuxthreads/no-tsd.c b/libpthread/linuxthreads/no-tsd.c deleted file mode 100644 index ef79cb832..000000000 --- a/libpthread/linuxthreads/no-tsd.c +++ /dev/null @@ -1,33 +0,0 @@ -/* libc-internal interface for thread-specific data. - Copyright (C) 1998 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 Library General Public License as - published by the Free Software Foundation; either version 2 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <bits/libc-tsd.h> - -/* This file provides uinitialized (common) definitions for the - hooks used internally by libc to access thread-specific data. - - When -lpthread is used, it provides initialized definitions for these - variables (in specific.c), which override these uninitialized definitions. - - If -lpthread is not used, these uninitialized variables default to zero, - which the __libc_tsd_* macros check for. */ - -void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t)); -int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t, - __const void *)); diff --git a/libpthread/linuxthreads/specific.c b/libpthread/linuxthreads/specific.c index 14c4b29d1..cf54f7fa1 100644 --- a/libpthread/linuxthreads/specific.c +++ b/libpthread/linuxthreads/specific.c @@ -166,7 +166,7 @@ libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer) return 0; } int (*__libc_internal_tsd_set)(enum __libc_tsd_key_t key, const void * pointer) - = libc_internal_tsd_set; + = libc_internal_tsd_set; static void * libc_internal_tsd_get(enum __libc_tsd_key_t key) @@ -176,4 +176,5 @@ libc_internal_tsd_get(enum __libc_tsd_key_t key) return THREAD_GETMEM_NC(self, p_libc_specific[key]); } void * (*__libc_internal_tsd_get)(enum __libc_tsd_key_t key) - = libc_internal_tsd_get; + = libc_internal_tsd_get; + diff --git a/libpthread/linuxthreads/sysdeps/pthread/bits/libc-tsd.h b/libpthread/linuxthreads/sysdeps/pthread/bits/libc-tsd.h index e38cdf550..ca53b94d2 100644 --- a/libpthread/linuxthreads/sysdeps/pthread/bits/libc-tsd.h +++ b/libpthread/linuxthreads/sysdeps/pthread/bits/libc-tsd.h @@ -1,5 +1,5 @@ /* libc-internal interface for thread-specific data. LinuxThreads version. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2001 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 @@ -25,11 +25,12 @@ /* Fast thread-specific data internal to libc. */ enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0, _LIBC_TSD_KEY_DL_ERROR, + _LIBC_TSD_KEY_RPC_VARS, _LIBC_TSD_KEY_N }; -extern void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t)); -extern int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t, - __const void *)); +extern void *(*__libc_internal_tsd_get) (enum __libc_tsd_key_t) __THROW; +extern int (*__libc_internal_tsd_set) (enum __libc_tsd_key_t, + __const void *) __THROW; #define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data; #define __libc_tsd_get(KEY) \ |