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] | |
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] |