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] Support more than 1024 threads


On Thu, Aug 08, 2002 at 11:59:52PM +0200, Jakub Jelinek wrote:
> Is there any reason why this shouldn't work (ie. does somebody
> use __pthread_handles before __pthread_initialize_minimal)?
> Testing still in progress.

As I wrote in the follow up mails, I've tested this using gdb and it
worked just fine, furthermore it makes libpthread at least
on IA-32 use one less page (because of the __pthread_handles placement
at end of .bss).

> 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

	Jakub


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