This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: LIBPTHREAD development step


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 */




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