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]

[RFC] Support more than 1024 threads


Hi!

Is there any reason why this shouldn't work (ie. does somebody
use __pthread_handles before __pthread_initialize_minimal)?
Testing still in progress.

The reason for moving __pthread_handles into separate file
is that it can be at the very end of bss, so that unless all 16384
threads are running the unneeded pages at the end are never touched.

2002-08-08  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/bits/local_lim.h (PTHREAD_THREADS_MAX):
	Bump to 16384.
	* manager.c (__pthread_handles): Remove.
	* pthandles.c: New.
	* pthread.c (__pthread_initialize_minimal): Initialize
	__pthread_handles[0] and __pthread_handles[1].
	* Makefile (libpthread-routines): Add pthandles (must be last).

--- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h.jj	2002-04-10 00:08:12.000000000 +0200
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h	2002-08-08 23:08:39.000000000 +0200
@@ -64,7 +64,7 @@
 /* The number of threads per process.  */
 #define _POSIX_THREAD_THREADS_MAX	64
 /* This is the value this implementation supports.  */
-#define PTHREAD_THREADS_MAX	1024
+#define PTHREAD_THREADS_MAX	16384
 
 /* Maximum amount by which a process can descrease its asynchronous I/O
    priority level.  */
--- libc/linuxthreads/manager.c.jj	2002-08-04 20:23:21.000000000 +0200
+++ libc/linuxthreads/manager.c	2002-08-08 23:39:01.000000000 +0200
@@ -36,25 +36,6 @@
 #include "restart.h"
 #include "semaphore.h"
 
-/* Array of active threads. Entry 0 is reserved for the initial thread. */
-struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX]
-#ifdef USE_TLS
-# if __LT_SPINLOCK_INIT != 0
-= {
-  { __LOCK_INITIALIZER, NULL, 0},
-  { __LOCK_INITIALIZER, NULL, 0},
-  /* All NULLs */
-}
-# endif
-#else
-= {
-  { __LOCK_INITIALIZER, &__pthread_initial_thread, 0},
-  { __LOCK_INITIALIZER, &__pthread_manager_thread, 0},
-  /* All NULLs */
-}
-#endif
-;
-
 /* For debugging purposes put the maximum number of threads in a variable.  */
 const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX;
 
--- libc/linuxthreads/pthread.c.jj	2002-08-08 10:39:16.000000000 +0200
+++ libc/linuxthreads/pthread.c	2002-08-08 23:06:51.000000000 +0200
@@ -417,6 +417,11 @@ __pthread_initialize_minimal(void)
 #ifdef USE_TLS
   pthread_descr self;
 
+  /* First of all init __pthread_handles[0] and [1] if needed.  */
+# if __LT_SPINLOCK_INIT != 0
+  __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
+  __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
+# endif
 # ifndef SHARED
   /* Unlike in the dynamically linked case the dynamic linker has not
      taken care of initializing the TLS data structures.  */
@@ -449,6 +454,14 @@ __pthread_initialize_minimal(void)
   /* And fill in the pointer the the thread __pthread_handles array.  */
   __pthread_handles[0].h_descr = self;
 #else
+  /* First of all init __pthread_handles[0] and [1].  */
+# if __LT_SPINLOCK_INIT != 0
+  __pthread_handles[0].h_lock = __LOCK_INITIALIZER;
+  __pthread_handles[1].h_lock = __LOCK_INITIALIZER;
+# endif
+  __pthread_handles[0].h_descr = &__pthread_initial_thread;
+  __pthread_handles[1].h_descr = &__pthread_manager_thread;
+
   /* If we have special thread_self processing, initialize that for the
      main thread now.  */
 # ifdef INIT_THREAD_SELF
--- libc/linuxthreads/Makefile.jj	2002-07-23 10:05:33.000000000 +0200
+++ libc/linuxthreads/Makefile	2002-08-08 23:38:05.000000000 +0200
@@ -36,7 +36,8 @@ libpthread-routines := attr cancel condv
 		       ptlongjmp pthread signals specific errno lockfile \
 		       semaphore spinlock wrapsyscall rwlock pt-machine \
 		       oldsemaphore events getcpuclockid pspinlock barrier \
-		       ptclock_gettime ptclock_settime sighandler
+		       ptclock_gettime ptclock_settime sighandler \
+		       pthandles
 
 nodelete-yes = -Wl,--enable-new-dtags,-z,nodelete
 initfirst-yes = -Wl,--enable-new-dtags,-z,initfirst
--- libc/linuxthreads/pthandles.c.jj	2002-08-09 00:17:21.000000000 +0200
+++ libc/linuxthreads/pthandles.c	2002-08-08 23:38:51.000000000 +0200
@@ -0,0 +1,6 @@
+#include <ldsodefs.h>
+#include "pthread.h"
+#include "internals.h"
+
+/* Array of active threads. Entry 0 is reserved for the initial thread. */
+struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX];

	Jakub


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