This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Re: LIBPTHREAD development step
- From: Anton Lavrentiev <lavr at ncbi dot nlm dot nih dot gov>
- To: libc-alpha at sources dot redhat dot com
- Cc: 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: Tue, 03 Sep 2002 11:53:15 -0400
- Subject: Re: LIBPTHREAD development step
- Organization: NCBI NIH
- References: <3D6FD24B.867A1E99@ncbi.nlm.nih.gov> <u8elcfvctg.fsf@gromit.moeb>
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 */