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


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]