summaryrefslogtreecommitdiff
path: root/libpthread/linuxthreads
diff options
context:
space:
mode:
Diffstat (limited to 'libpthread/linuxthreads')
-rw-r--r--libpthread/linuxthreads/Makefile4
-rw-r--r--libpthread/linuxthreads/cancel.c13
-rw-r--r--libpthread/linuxthreads/no-tsd.c33
-rw-r--r--libpthread/linuxthreads/specific.c5
-rw-r--r--libpthread/linuxthreads/sysdeps/pthread/bits/libc-tsd.h9
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) \