SEM_UNDO fix for LinuxThreads

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

SEM_UNDO fix for LinuxThreads

Daniel Jacobowitz-2
Because LinuxThreads threads are not part of the same thread group,
if we want them to share certain semaphore information - particularly
the records needed for SEM_UNDO - then we need to request them
explicitly.

This was also posted by David Wilder in 2003:
  http://sources.redhat.com/ml/libc-alpha/2003-04/msg00274.html

But I independently fixed it before it occurred to me to Google for other
fixes :-)

--
Daniel Jacobowitz
CodeSourcery

2006-05-01  Daniel Jacobowitz  <[hidden email]>

        * manager.c (pthread_handle_create): Use CLONE_SYSVSEM.
        * pthread.c (__pthread_initialize_manager): Likewise.

Index: manager.c
===================================================================
RCS file: /cvs/glibc/linuxthreads/linuxthreads/manager.c,v
retrieving revision 1.99
diff -u -p -r1.99 manager.c
--- manager.c 26 Apr 2006 15:04:12 -0000 1.99
+++ manager.c 1 May 2006 17:23:15 -0000
@@ -744,15 +744,15 @@ static int pthread_handle_create(pthread
   pid = __clone2(pthread_start_thread_event,
    (void **)new_thread_bottom,
  (char *)stack_addr - new_thread_bottom,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
+ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM |
  __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 |
+ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM |
  __pthread_sig_cancel, new_thread);
 #else
   pid = __clone(pthread_start_thread_event, stack_addr,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
+ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM |
  __pthread_sig_cancel, new_thread);
 #endif
   saved_errno = errno;
@@ -785,15 +785,15 @@ static int pthread_handle_create(pthread
       pid = __clone2(pthread_start_thread,
      (void **)new_thread_bottom,
                      (char *)stack_addr - new_thread_bottom,
-     CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
+     CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM |
      __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 |
+    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM |
     __pthread_sig_cancel, new_thread);
 #else
       pid = __clone(pthread_start_thread, stack_addr,
-    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND |
+    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM |
     __pthread_sig_cancel, new_thread);
 #endif /* !NEED_SEPARATE_REGISTER_STACK */
       saved_errno = errno;
Index: pthread.c
===================================================================
RCS file: /cvs/glibc/linuxthreads/linuxthreads/pthread.c,v
retrieving revision 1.138
diff -u -p -r1.138 pthread.c
--- pthread.c 1 May 2006 16:26:34 -0000 1.138
+++ pthread.c 1 May 2006 17:23:15 -0000
@@ -746,17 +746,17 @@ int __pthread_initialize_manager(void)
   pid = __clone2(__pthread_manager_event,
  (void **) __pthread_manager_thread_bos,
  THREAD_MANAGER_STACK_SIZE,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
+ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM,
  mgr);
 #elif _STACK_GROWS_UP
   pid = __clone(__pthread_manager_event,
  (void **) __pthread_manager_thread_bos,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
+ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM,
  mgr);
 #else
   pid = __clone(__pthread_manager_event,
  (void **) __pthread_manager_thread_tos,
- CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND,
+ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM,
  mgr);
 #endif
 
@@ -786,13 +786,13 @@ int __pthread_initialize_manager(void)
 #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, mgr);
+     CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM, mgr);
 #elif _STACK_GROWS_UP
       pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_bos,
-    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, mgr);
+    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM, mgr);
 #else
       pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos,
-    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, mgr);
+    CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SYSVSEM, mgr);
 #endif
     }
   if (__builtin_expect (pid, 0) == -1) {