This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: LIBPTHREAD development step
- From: Corey Minyard <minyard at acm dot org>
- To: Anton Lavrentiev <lavr at ncbi dot nlm dot nih dot gov>
- Cc: libc-alpha at sources dot redhat dot com, Andreas Jaeger <aj at suse dot de>, glibc-sc at gnu dot org, cpp-core at ncbi dot nlm dot nih dot gov, domrach at ncbi dot nlm dot nih dot gov
- Date: Thu, 05 Sep 2002 15:29:31 -0500
- Subject: Re: LIBPTHREAD development step
- References: <3D6FD24B.867A1E99@ncbi.nlm.nih.gov> <u8elcfvctg.fsf@gromit.moeb> <3D74DAEB.3DE9D532@ncbi.nlm.nih.gov>
Just a note before you try to use this. This patch will not work
correctly, it perhaps fixes one problem, but it causes many others. For
instance, with CLONE_THREAD, all the signals sent to any member of the
process (and not caused by the thread itself) will be delivered to the
first thread in the process. This will break a large number of
programs, including all JVM implementations. So you have a lot more
complex things to do to make this work.
I have a threads library at http://ssthreads.sf.net that is a drop-in
replacement for Linuxthreads but behaves much closer to POSIX, and uses
CLONE_THREAD. Perhaps you can use that until Ulrich and company come
out with their new threads work.
-Corey
Anton Lavrentiev wrote:
Andreas Jaeger wrote:
Anton Lavrentiev <lavr@ncbi.nlm.nih.gov> writes:
Dear GLIBC Streering Committee:
As of v2.2.5 of GLIBC there is still a missing feature in LIBPTHREAD
about threads being created as independent processes and not sharing
the same PID. "Known-Bugs" of LIBPTHREAD lists this feature to
be missing until CLONE_PID will be implemented in the kernel.
It is in fact implemented since kernel 2.4, and was around for
quite a long, but it is called differently, CLONE_THREAD.
It employs same TGID (thread group ID) task identifier, returned
as process ID (via getpid()) for all threads in the program.
Below please find patch files to apply to GLIBC 2.2.5 to take
advantage of this Linux kernel feature.
Patch for glibc-2.2.5/sysdeps/unix/sysv/linux/bits/sched.h
Patch for glibc-2.2.5/linuxthreads/pthread.c
Patch for glibc-2.2.5/linuxthreads/manager.c
Please send those patches to libc-alpha@sources.redhat.com.
Note that for glibc 2.2 we only accept bug fixes, these kind of
patches are more appropriate for the glibc 2.3 branch but Ulrich is
also working on similar issues, so your patch might conflict with his
work.
Thanks,
Andreas
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.inka.de
http://www.suse.de/~aj
------------------------------------------------------------------------
*** glibc-2.2.5/sysdeps/unix/sysv/linux/bits/sched.h Fri Aug 30 15:19:28 2002
--- glibc-2.2.5/sysdeps/unix/sysv/linux/bits/sched.h.orig Fri Aug 30 16:07:21 2002
***************
*** 41,48 ****
# define CLONE_PTRACE 0x00002000 /* Set if tracing continues on the child. */
# define CLONE_VFORK 0x00004000 /* Set if the parent wants the child to
wake it up on mm_release. */
- #define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
- #define CLONE_THREAD 0x00010000 /* Same thread group? */
#endif
/* The official definition. */
--- 41,46 ----
------------------------------------------------------------------------
*** glibc-2.2.5/linuxthreads/pthread.c Fri Aug 30 15:14:30 2002
--- glibc-2.2.5/linuxthreads/pthread.c.orig Fri Nov 30 16:16:35 2001
***************
*** 35,46 ****
#include <resolv.h>
#undef _res
- #ifdef CLONE_THREAD
- #define CLONE_FLAGS (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD)
- #else
- #define CLONE_FLAGS (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
- #endif
-
extern struct __res_state _res;
/* Sanity check. */
--- 35,40 ----
*************** int __pthread_initialize_manager(void)
*** 564,578 ****
pid = __clone2(__pthread_manager_event,
(void **) __pthread_manager_thread_bos,
THREAD_MANAGER_STACK_SIZE,
! CLONE_FLAGS, (void *)(long)manager_pipe[0]);
#elif _STACK_GROWS_UP
pid = __clone(__pthread_manager_event,
(void **) __pthread_manager_thread_bos,
! CLONE_FLAGS, (void *)(long)manager_pipe[0]);
#else
pid = __clone(__pthread_manager_event,
(void **) __pthread_manager_thread_tos,
! CLONE_FLAGS, (void *)(long)manager_pipe[0]);
#endif
if (pid != -1)
--- 558,575 ----
pid = __clone2(__pthread_manager_event,
(void **) __pthread_manager_thread_bos,
THREAD_MANAGER_STACK_SIZE,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
! (void *)(long)manager_pipe[0]);
#elif _STACK_GROWS_UP
pid = __clone(__pthread_manager_event,
(void **) __pthread_manager_thread_bos,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
! (void *)(long)manager_pipe[0]);
#else
pid = __clone(__pthread_manager_event,
(void **) __pthread_manager_thread_tos,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
! (void *)(long)manager_pipe[0]);
#endif
if (pid != -1)
*************** int __pthread_initialize_manager(void)
*** 602,614 ****
#ifdef NEED_SEPARATE_REGISTER_STACK
pid = __clone2(__pthread_manager, (void **) __pthread_manager_thread_bos,
THREAD_MANAGER_STACK_SIZE,
! CLONE_FLAGS, (void *)(long)manager_pipe[0]);
#elif _STACK_GROWS_UP
pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_bos,
! CLONE_FLAGS, (void *)(long)manager_pipe[0]);
#else
pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos,
! CLONE_FLAGS, (void *)(long)manager_pipe[0]);
#endif
}
if (__builtin_expect (pid, 0) == -1) {
--- 599,614 ----
#ifdef NEED_SEPARATE_REGISTER_STACK
pid = __clone2(__pthread_manager, (void **) __pthread_manager_thread_bos,
THREAD_MANAGER_STACK_SIZE,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
! (void *)(long)manager_pipe[0]);
#elif _STACK_GROWS_UP
pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_bos,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
! (void *)(long)manager_pipe[0]);
#else
pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
! (void *)(long)manager_pipe[0]);
#endif
}
if (__builtin_expect (pid, 0) == -1) {
------------------------------------------------------------------------
*** glibc-2.2.5/linuxthreads/manager.c Fri Aug 30 11:10:39 2002
--- glibc-2.2.5/linuxthreads/manager.c.orig Thu Nov 29 02:45:19 2001
***************
*** 33,46 ****
#include "restart.h"
#include "semaphore.h"
-
- #ifdef CLONE_THREAD
- #define CLONE_FLAGS (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD)
- #else
- #define CLONE_FLAGS (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
- #endif
-
-
/* Array of active threads. Entry 0 is reserved for the initial thread. */
struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
{ { __LOCK_INITIALIZER, &__pthread_initial_thread, 0},
--- 33,38 ----
*************** static int pthread_handle_create(pthread
*** 642,654 ****
pid = __clone2(pthread_start_thread_event,
(void **)new_thread_bottom,
(char *)new_thread - new_thread_bottom,
! CLONE_FLAGS | __pthread_sig_cancel, new_thread);
#elif _STACK_GROWS_UP
pid = __clone(pthread_start_thread_event, (void **) new_thread_bottom,
! CLONE_FLAGS | __pthread_sig_cancel, new_thread);
#else
pid = __clone(pthread_start_thread_event, (void **) new_thread,
! CLONE_FLAGS | __pthread_sig_cancel, new_thread);
#endif
if (pid != -1)
{
--- 634,649 ----
pid = __clone2(pthread_start_thread_event,
(void **)new_thread_bottom,
(char *)new_thread - new_thread_bottom,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
! __pthread_sig_cancel, new_thread);
#elif _STACK_GROWS_UP
pid = __clone(pthread_start_thread_event, (void **) new_thread_bottom,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
! __pthread_sig_cancel, new_thread);
#else
pid = __clone(pthread_start_thread_event, (void **) new_thread,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
! __pthread_sig_cancel, new_thread);
#endif
if (pid != -1)
{
*************** static int pthread_handle_create(pthread
*** 679,691 ****
pid = __clone2(pthread_start_thread,
(void **)new_thread_bottom,
(char *)new_thread - new_thread_bottom,
! CLONE_FLAGS | __pthread_sig_cancel, new_thread);
#elif _STACK_GROWS_UP
pid = __clone(pthread_start_thread, (void **) new_thread_bottom,
! CLONE_FLAGS | __pthread_sig_cancel, new_thread);
#else
pid = __clone(pthread_start_thread, (void **) new_thread,
! CLONE_FLAGS | __pthread_sig_cancel, new_thread);
#endif /* !NEED_SEPARATE_REGISTER_STACK */
}
/* Check if cloning succeeded */
--- 674,689 ----
pid = __clone2(pthread_start_thread,
(void **)new_thread_bottom,
(char *)new_thread - new_thread_bottom,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
! __pthread_sig_cancel, new_thread);
#elif _STACK_GROWS_UP
pid = __clone(pthread_start_thread, (void **) new_thread_bottom,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
! __pthread_sig_cancel, new_thread);
#else
pid = __clone(pthread_start_thread, (void **) new_thread,
! CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
! __pthread_sig_cancel, new_thread);
#endif /* !NEED_SEPARATE_REGISTER_STACK */
}
/* Check if cloning succeeded */