* [RFC] Support more than 1024 threads
@ 2002-08-08 14:59 Jakub Jelinek
2002-08-08 15:30 ` Ulrich Drepper
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-08 14:59 UTC (permalink / raw)
To: Ulrich Drepper, Roland McGrath; +Cc: Glibc hackers
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Support more than 1024 threads
2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
@ 2002-08-08 15:30 ` Ulrich Drepper
2002-08-09 1:15 ` Jakub Jelinek
2002-08-27 22:37 ` [PATCH] " Jakub Jelinek
2002-08-27 23:46 ` [RFC] " Ulrich Drepper
2 siblings, 1 reply; 6+ messages in thread
From: Ulrich Drepper @ 2002-08-08 15:30 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Roland McGrath, Glibc hackers
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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.
Well, test using gdb. I fixed several problems in this area yesterday
and before but who knows.
- --
- ---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQE9UvEQ2ijCOnn/RHQRAoYnAJ0W7+S+XkZcHtyCLoRJXW6BTGPGxgCgiAyU
z8fXB8voGiHEupd6lHMsDjA=
=s7Ff
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Support more than 1024 threads
2002-08-08 15:30 ` Ulrich Drepper
@ 2002-08-09 1:15 ` Jakub Jelinek
2002-08-09 1:41 ` Jakub Jelinek
0 siblings, 1 reply; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-09 1:15 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Roland McGrath, Glibc hackers
On Thu, Aug 08, 2002 at 03:30:36PM -0700, Ulrich Drepper wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> 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.
>
> Well, test using gdb. I fixed several problems in this area yesterday
> and before but who knows.
Works just fine (of course provided gdb is pointed
to the right linuxthreads_db if the glibc is not installed yet).
make check passed too.
Will do some more checks to see whether libpthread
memory usage increased because of this (comparing /proc/statm for this version,
version without this patch and version with this patch but
with PTHREAD_THREADS_MAX 1024).
Jakub
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Support more than 1024 threads
2002-08-09 1:15 ` Jakub Jelinek
@ 2002-08-09 1:41 ` Jakub Jelinek
0 siblings, 0 replies; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-09 1:41 UTC (permalink / raw)
To: Ulrich Drepper; +Cc: Roland McGrath, Glibc hackers
On Fri, Aug 09, 2002 at 10:15:45AM +0200, Jakub Jelinek wrote:
> On Thu, Aug 08, 2002 at 03:30:36PM -0700, Ulrich Drepper wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > 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.
> >
> > Well, test using gdb. I fixed several problems in this area yesterday
> > and before but who knows.
>
> Works just fine (of course provided gdb is pointed
> to the right linuxthreads_db if the glibc is not installed yet).
> make check passed too.
> Will do some more checks to see whether libpthread
> memory usage increased because of this (comparing /proc/statm for this version,
> version without this patch and version with this patch but
> with PTHREAD_THREADS_MAX 1024).
These are results from hacking up linuxthreads/Examples/ex2.c, so that
it does fgetc(stdin);
95 95 79 2 0 93 16 - .bss, 16384 (this is current CVS + the patch I posted)
95 95 79 2 0 93 16 - .bss, 1024
96 96 79 2 0 94 17 - .data, 1024 (this is current CVS)
So it looks like it could make things one page better, not worse.
Jakub
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] Support more than 1024 threads
2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
2002-08-08 15:30 ` Ulrich Drepper
@ 2002-08-27 22:37 ` Jakub Jelinek
2002-08-27 23:46 ` [RFC] " Ulrich Drepper
2 siblings, 0 replies; 6+ messages in thread
From: Jakub Jelinek @ 2002-08-27 22:37 UTC (permalink / raw)
To: Ulrich Drepper, Roland McGrath; +Cc: Glibc hackers
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Support more than 1024 threads
2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
2002-08-08 15:30 ` Ulrich Drepper
2002-08-27 22:37 ` [PATCH] " Jakub Jelinek
@ 2002-08-27 23:46 ` Ulrich Drepper
2 siblings, 0 replies; 6+ messages in thread
From: Ulrich Drepper @ 2002-08-27 23:46 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Roland McGrath, Glibc hackers
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Jakub Jelinek wrote:
> 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).
I've applied the patch now. Thanks,
- --
- ---------------. ,-. 1325 Chesapeake Terrace
Ulrich Drepper \ ,-------------------' \ Sunnyvale, CA 94089 USA
Red Hat `--' drepper at redhat.com `------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQE9bHHI2ijCOnn/RHQRAj7sAJ0Yp+BO7jG+HPBOWgPWVrAXvZtb3ACgoaD1
sUx3IMMxYH0w8dgWfnaY7zY=
=zaem
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2002-08-28 6:46 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-08-08 14:59 [RFC] Support more than 1024 threads Jakub Jelinek
2002-08-08 15:30 ` Ulrich Drepper
2002-08-09 1:15 ` Jakub Jelinek
2002-08-09 1:41 ` Jakub Jelinek
2002-08-27 22:37 ` [PATCH] " Jakub Jelinek
2002-08-27 23:46 ` [RFC] " Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).