This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Some NPTL libpthread.a fixes (take 2)


Hi!

This is updated version that adds pthread_create -> pthread_cancel
and pthread_cancel -> pthread_create dependencies, as GCC is now considering
using pthread_cancel as the key symbol instead (because of some gprof
or whatever).
Again, the patch has no negative impact on libpthread.so (which is all
that matters) and improves usability of libpthread.a (which shouldn't
be used, but some people still insist on using it).

2004-11-20  Jakub Jelinek  <jakub@redhat.com>

	* Makefile (libpthread-routines): Add vars.
	* sysdeps/pthread/createthread.c (__pthread_multiple_threads): Remove.
	* init.c (__default_stacksize, __is_smp): Remove.
	* vars.c: New file.
	* pthreadP.h (__find_thread_by_id): If !SHARED, add weak_function
	and define a wrapper macro.
	(PTHREAD_STATIC_FN_REQUIRE): Define.
	* allocatestack.c (__find_thread_by_id): Undefine.
	* pthread_create (__pthread_keys): Remove.
	(pthread_mutex_lock, pthread_mutex_unlock, pthread_once,
	pthread_key_create, pthread_setspecific, pthread_getspecific): Add
	PTHREAD_STATIC_FN_REQUIRE.

--- libc/nptl/Makefile.jj	2004-11-12 13:57:44.000000000 +0100
+++ libc/nptl/Makefile	2004-11-19 18:36:37.000000000 +0100
@@ -30,7 +30,7 @@ install-lib-ldscripts := libpthread.so
 routines = alloca_cutoff forward libc-lowlevellock libc-cancellation
 shared-only-routines = forward
 
-libpthread-routines = init events version \
+libpthread-routines = init vars events version \
 		      pthread_create pthread_exit pthread_detach \
 		      pthread_join pthread_tryjoin pthread_timedjoin \
 		      pthread_self pthread_equal pthread_yield \
--- libc/nptl/sysdeps/pthread/createthread.c.jj	2004-11-10 07:53:09.000000000 +0100
+++ libc/nptl/sysdeps/pthread/createthread.c	2004-11-19 18:38:03.000000000 +0100
@@ -42,8 +42,6 @@
 
 
 #ifndef TLS_MULTIPLE_THREADS_IN_TCB
-/* Variable set to a nonzero value if more than one thread runs or ran.  */
-int __pthread_multiple_threads attribute_hidden;
 /* Pointer to the corresponding variable in libc.  */
 int *__libc_multiple_threads_ptr attribute_hidden;
 #endif
--- libc/nptl/init.c.jj	2004-09-20 15:35:01.000000000 +0200
+++ libc/nptl/init.c	2004-11-20 00:06:01.000000000 +0100
@@ -56,16 +56,10 @@
 #endif
 
 
-/* Default stack size.  */
-size_t __default_stacksize attribute_hidden;
-
 /* Size and alignment of static TLS block.  */
 size_t __static_tls_size;
 size_t __static_tls_align_m1;
 
-/* Flag whether the machine is SMP or not.  */
-int __is_smp attribute_hidden;
-
 /* Version of the library, used in libthread_db to detect mismatches.  */
 static const char nptl_version[] __attribute_used__ = VERSION;
 
--- libc/nptl/vars.c.jj	2004-11-19 19:03:31.000000000 +0100
+++ libc/nptl/vars.c	2004-11-20 00:08:58.000000000 +0100
@@ -0,0 +1,43 @@
+/* Copyright (C) 2004 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; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <pthreadP.h>
+#include <stdlib.h>
+#include <tls.h>
+#include <unistd.h>
+
+/* Default stack size.  */
+size_t __default_stacksize attribute_hidden
+#ifdef SHARED
+;
+#else
+  = PTHREAD_STACK_MIN;
+#endif
+
+/* Flag whether the machine is SMP or not.  */
+int __is_smp attribute_hidden;
+
+#ifndef TLS_MULTIPLE_THREADS_IN_TCB
+/* Variable set to a nonzero value if more than one thread runs or ran.  */
+int __pthread_multiple_threads attribute_hidden;
+#endif
+
+/* Table of the key information.  */
+struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX]
+  __attribute__ ((nocommon));
+hidden_data_def (__pthread_keys)
--- libc/nptl/pthreadP.h.jj	2004-11-12 13:57:44.000000000 +0100
+++ libc/nptl/pthreadP.h	2004-11-19 23:40:26.000000000 +0100
@@ -278,7 +278,14 @@ extern int *__libc_multiple_threads_ptr 
 #endif
 
 /* Find a thread given its TID.  */
-extern struct pthread *__find_thread_by_id (pid_t tid) attribute_hidden;
+extern struct pthread *__find_thread_by_id (pid_t tid) attribute_hidden
+#ifdef SHARED
+;
+#else
+weak_function;
+#define __find_thread_by_id(tid) \
+  (__find_thread_by_id ? (__find_thread_by_id) (tid) : (struct pthread *) NULL)
+#endif
 
 extern void __pthread_init_static_tls (struct link_map *) attribute_hidden;
 
@@ -450,4 +457,10 @@ extern void __nptl_deallocate_tsd (void)
 
 extern int __nptl_setxid (struct xid_command *cmdp) attribute_hidden;
 
+#ifdef SHARED
+# define PTHREAD_STATIC_FN_REQUIRE(name)
+#else
+# define PTHREAD_STATIC_FN_REQUIRE(name) __asm (".globl " #name);
+#endif
+
 #endif	/* pthreadP.h */
--- libc/nptl/allocatestack.c.jj	2004-11-12 13:57:44.000000000 +0100
+++ libc/nptl/allocatestack.c	2004-11-19 23:50:24.000000000 +0100
@@ -771,6 +771,7 @@ __reclaim_stacks (void)
 
 
 #if HP_TIMING_AVAIL
+# undef __find_thread_by_id
 /* Find a thread given the thread ID.  */
 attribute_hidden
 struct pthread *
--- libc/nptl/pthread_create.c.jj	2004-11-10 07:53:09.000000000 +0100
+++ libc/nptl/pthread_create.c	2004-11-20 10:06:16.046079077 +0100
@@ -55,11 +55,6 @@ unsigned int __nptl_nthreads = 1;
 #include "createthread.c"
 
 
-/* Table of the key information.  */
-struct pthread_key_struct __pthread_keys[PTHREAD_KEYS_MAX]
-  __attribute__ ((nocommon));
-hidden_data_def (__pthread_keys)
-
 struct pthread *
 internal_function
 __find_in_stack_list (pd)
@@ -513,3 +508,15 @@ compat_symbol (libpthread, __pthread_cre
 /* Information for libthread_db.  */
 
 #include "../nptl_db/db_info.c"
+
+/* If pthread_create is present, libgcc_eh.a and libsupc++.a expects some other POSIX thread
+   functions to be present as well.  */
+PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_lock)
+PTHREAD_STATIC_FN_REQUIRE (pthread_mutex_unlock)
+
+PTHREAD_STATIC_FN_REQUIRE (pthread_once)
+PTHREAD_STATIC_FN_REQUIRE (pthread_cancel)
+
+PTHREAD_STATIC_FN_REQUIRE (pthread_key_create)
+PTHREAD_STATIC_FN_REQUIRE (pthread_setspecific)
+PTHREAD_STATIC_FN_REQUIRE (pthread_getspecific)
--- libc/nptl/pthread_cancel.c.jj	2003-12-21 12:55:40.000000000 +0100
+++ libc/nptl/pthread_cancel.c	2004-11-20 10:06:54.350237790 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -100,3 +100,5 @@ pthread_cancel (th)
 
   return result;
 }
+
+PTHREAD_STATIC_FN_REQUIRE (pthread_create)

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]