Update.
[kopensolaris-gnu/glibc.git] / linuxthreads / ptfork.c
index 2245407..564f8d7 100644 (file)
@@ -20,6 +20,7 @@
 #include <unistd.h>
 #include "pthread.h"
 #include "internals.h"
+#include <bits/libc-lock.h>
 
 struct handler_list {
   void (*handler)(void);
@@ -73,26 +74,43 @@ static inline void pthread_call_handlers(struct handler_list * list)
   for (/*nothing*/; list != NULL; list = list->next) (list->handler)();
 }
 
-extern int __fork(void);
+extern int __libc_fork(void);
 
-int fork(void)
+pid_t __fork(void)
 {
-  int pid;
-  struct handler_list * prepare, * child, * parent;
+  pid_t pid;
 
   pthread_mutex_lock(&pthread_atfork_lock);
-  prepare = pthread_atfork_prepare;
-  child = pthread_atfork_child;
-  parent = pthread_atfork_parent;
-  pthread_mutex_unlock(&pthread_atfork_lock);
-  pthread_call_handlers(prepare);
-  pid = __fork();
+
+  pthread_call_handlers(pthread_atfork_prepare);
+  __pthread_once_fork_prepare();
+  __flockfilelist();
+
+  pid = __libc_fork();
+
   if (pid == 0) {
     __pthread_reset_main_thread();
+
     __fresetlockfiles();
-    pthread_call_handlers(child);
+    __pthread_once_fork_child();
+    pthread_call_handlers(pthread_atfork_child);
+
+    pthread_mutex_init(&pthread_atfork_lock, NULL);
   } else {
-    pthread_call_handlers(parent);
+    __funlockfilelist();
+    __pthread_once_fork_parent();
+    pthread_call_handlers(pthread_atfork_parent);
+
+    pthread_mutex_unlock(&pthread_atfork_lock);
   }
+
   return pid;
 }
+
+weak_alias (__fork, fork);
+
+pid_t __vfork(void)
+{
+  return __fork();
+}
+weak_alias (__vfork, vfork);