[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH] Add dummy pthread_* symbols to libc, copied from LinuxThreads



This adds several pthread_* symbols to libc, that do nothing and are
used when libpthread is not loaded.
The code is taken verbatim from LinuxThreads.
Again, this allows to run programs linked against LinuxThreads-based
libc.so's.

diff -urNdp nptl/no-tsd.c nptl/no-tsd.c
--- nptl/no-tsd.c	1970-01-01 01:00:00.000000000 +0100
+++ nptl/no-tsd.c	2002-10-31 16:48:42.000000000 +0100
@@ -0,0 +1,46 @@
+/* libc-internal interface for thread-specific data.
+   Copyright (C) 1998,99,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; 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 <sys/cdefs.h>  /* for __const */
+#include <stdlib.h>
+#include <bits/libc-tsd.h>
+
+#if !(USE_TLS && HAVE___THREAD)
+
+/* 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) (enum __libc_tsd_key_t);
+int (*__libc_internal_tsd_set) (enum __libc_tsd_key_t,
+				__const void *);
+void **(*__libc_internal_tsd_address) (enum __libc_tsd_key_t)
+     __THROW __attribute__ ((__const__));
+
+#endif /* !(USE_TLS && HAVE___THREAD) */
+
+int __libc_alloca_cutoff (size_t size)
+{
+  return size <= __MAX_ALLOCA_CUTOFF;
+}
diff -urNdp nptl/Versions nptl/Versions
--- nptl/Versions	2002-10-10 09:28:35.000000000 +0200
+++ nptl/Versions	2002-10-31 21:51:46.000000000 +0100
@@ -1,3 +1,37 @@
+libc {
+  GLIBC_2.0 {
+    pthread_attr_destroy; pthread_attr_getdetachstate;
+    pthread_attr_getinheritsched; pthread_attr_getschedparam;
+    pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init;
+    pthread_attr_setdetachstate; pthread_attr_setinheritsched;
+    pthread_attr_setschedparam; pthread_attr_setschedpolicy;
+    pthread_attr_setscope; pthread_cond_broadcast; pthread_cond_destroy;
+    pthread_cond_init; pthread_cond_signal; pthread_cond_wait;
+    pthread_condattr_destroy; pthread_condattr_init; pthread_equal;
+    pthread_exit; pthread_getschedparam; pthread_mutex_destroy;
+    pthread_mutex_init; pthread_mutex_lock; pthread_mutex_unlock;
+    pthread_mutexattr_getkind_np; pthread_mutexattr_setkind_np;
+    pthread_self; pthread_setcancelstate; pthread_setcanceltype;
+    pthread_setschedparam;
+  }
+  GLIBC_2.1 {
+    pthread_attr_init;
+  }
+  GLIBC_PRIVATE {
+    # Internal libc interface to libpthread
+    __libc_internal_tsd_get; __libc_internal_tsd_set;
+    __libc_internal_tsd_address; __libc_alloca_cutoff;
+  }
+}
+
+ld {
+  GLIBC_PRIVATE {
+    # Internal libc interface to libpthread
+    __libc_internal_tsd_get; __libc_internal_tsd_set;
+    __libc_internal_tsd_address;
+  }
+}
+
 libpthread {
   GLIBC_2.0 {
     pthread_create; pthread_join; pthread_self; pthread_equal;
diff -urNdp nptl/weaks.c nptl/weaks.c
--- nptl/weaks.c	1970-01-01 01:00:00.000000000 +0100
+++ nptl/weaks.c	2002-10-31 16:47:29.000000000 +0100
@@ -0,0 +1,119 @@
+/* The weak pthread functions for Linux.
+   Copyright (C) 1996,97,98,99,2000,01,02 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; 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 <limits.h>
+#include <stdlib.h>
+#include <shlib-compat.h>
+#include <bp-sym.h>
+
+extern int __pthread_return_0 (void);
+extern int __pthread_return_1 (void);
+extern void __pthread_return_void (void);
+extern void weak_function pthread_exit (void *__retval)
+     __attribute__ ((noreturn));
+
+/* Those are pthread functions which return 0 if successful. */
+weak_alias (__pthread_return_0, BP_SYM (__libc_pthread_attr_init_2_1))
+versioned_symbol (libpthread, BP_SYM (__libc_pthread_attr_init_2_1),
+		  BP_SYM (pthread_attr_init), GLIBC_2_1);
+#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
+weak_alias (__pthread_return_0, BP_SYM (__libc_pthread_attr_init_2_0))
+compat_symbol (libpthread, BP_SYM (__libc_pthread_attr_init_2_0),
+	       BP_SYM (pthread_attr_init), GLIBC_2_0);
+#endif
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setdetachstate))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getdetachstate))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setschedparam))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getschedparam))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setschedpolicy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getschedpolicy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setinheritsched))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getinheritsched))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setscope))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getscope))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setstackaddr))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getstackaddr))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_setstacksize))
+weak_alias (__pthread_return_0, BP_SYM (pthread_attr_getstacksize))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutex_init))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutex_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutex_lock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutex_trylock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutex_unlock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutexattr_init))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutexattr_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutexattr_settype))
+weak_alias (__pthread_return_0, BP_SYM (pthread_mutexattr_gettype))
+weak_alias (__pthread_return_0, BP_SYM (pthread_condattr_init))
+weak_alias (__pthread_return_0, BP_SYM (pthread_condattr_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_setschedparam))
+weak_alias (__pthread_return_0, BP_SYM (pthread_getschedparam))
+weak_alias (__pthread_return_0, BP_SYM (pthread_getcancelstate))
+weak_alias (__pthread_return_0, BP_SYM (pthread_setcancelstate))
+weak_alias (__pthread_return_0, BP_SYM (pthread_setcanceltype))
+weak_alias (__pthread_return_0, pthread_setconcurrency)
+weak_alias (__pthread_return_0, pthread_getconcurrency)
+weak_alias (__pthread_return_0, pthread_self)
+weak_alias (__pthread_return_0, BP_SYM (pthread_cond_init))
+weak_alias (__pthread_return_0, BP_SYM (pthread_cond_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_cond_wait))
+weak_alias (__pthread_return_0, BP_SYM (pthread_cond_timedwait))
+weak_alias (__pthread_return_0, BP_SYM (pthread_cond_signal))
+weak_alias (__pthread_return_0, BP_SYM (pthread_cond_broadcast))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_init))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_rdlock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_wrlock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_tryrdlock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_trywrlock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlock_unlock))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlockattr_init))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlockattr_destroy))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlockattr_setpshared))
+weak_alias (__pthread_return_0, BP_SYM (pthread_rwlockattr_getpshared))
+
+
+/* Those are pthread functions which return 1 if successful. */
+weak_alias (__pthread_return_1, pthread_equal)
+
+/* pthread_exit () is a special case. */
+void
+weak_function
+pthread_exit (void *retval)
+{
+  exit (EXIT_SUCCESS);
+}
+
+int
+__pthread_return_0 (void)
+{
+  return 0;
+}
+
+int
+__pthread_return_1 (void)
+{
+  return 1;
+}
+
+void
+__pthread_return_void (void)
+{
+}
diff -urNdp nptl/Makefile nptl/Makefile
--- nptl/Makefile	2002-10-10 09:28:13.000000000 +0200
+++ nptl/Makefile	2002-10-31 23:32:12.000000000 +0100
@@ -28,6 +28,7 @@ headers := pthread.h semaphore.h
 extra-libs := libpthread
 extra-libs-others := $(extra-libs)
 
+routines := weaks no-tsd
 
 libpthread-routines = init events \
 		      pthread_create pthread_exit pthread_detach \

Attachment: pgp00003.pgp
Description: PGP signature


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]