فهرست منبع

Arthur Shipkowski, art ! videon-central ! com, writes:

I've noticed a few people have posted over the last year about problems
compiling programs that use vfork when pthreads are involved.  Some
detective work turned up that ptfork.c aliases vfork to fork and then tries
to call the original fork as __libc_fork.  This patch removes the aliasing
when there is no MMU present, and uses the same call semantics to call
__libc_vfork.  I then added a symbol to the m68k vfork.S to allow vfork to
be called as __libc_vfork.

The same bug exists in the uClibc CVS, and with a possible tweak this patch
should go through there as well.

Obviously, all other platforms need __libc_vfork as a workable means to call
vfork in order for this to work for them.

Let me know if there are any problems with this patch.

Art Shipkowski
Videon Central Software Engineer
(814)235-1111 x307
Eric Andersen 20 سال پیش
والد
کامیت
dfc535be8f
2فایلهای تغییر یافته به همراه28 افزوده شده و 1 حذف شده
  1. 3 0
      libc/sysdeps/linux/m68k/vfork.S
  2. 25 1
      libpthread/linuxthreads/ptfork.c

+ 3 - 0
libc/sysdeps/linux/m68k/vfork.S

@@ -11,10 +11,13 @@
 	.align 2
 	.globl errno
 	.globl vfork
+	.globl __libc_vfork
 #if defined __HAVE_ELF__
 	.type	 vfork,@function
+	.type	 __libc_vfork,@function
 #endif
 vfork:
+__libc_vfork:
 	movl	%sp@+, %a1               /* save the return address for later */
 	movl	IMM __NR_vfork,%d0
 	trap	#0

+ 25 - 1
libpthread/linuxthreads/ptfork.c

@@ -74,7 +74,7 @@ static inline void pthread_call_handlers(struct handler_list * list)
 {
   for (/*nothing*/; list != NULL; list = list->next) (list->handler)();
 }
-
+#ifdef __UCLIBC_HAS_MMU__
 extern int __libc_fork(void);
 
 pid_t __fork(void)
@@ -105,3 +105,27 @@ pid_t __vfork(void)
   return __fork();
 }
 weak_alias (__vfork, vfork);
+#else
+pid_t __vfork(void)
+{
+  pid_t pid;
+  struct handler_list * prepare, * child, * parent;
+
+  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 = __libc_vfork();
+  if (pid == 0) {
+    __pthread_reset_main_thread();
+    __fresetlockfiles();
+    pthread_call_handlers(child);
+  } else {
+    pthread_call_handlers(parent);
+  }
+  return pid;
+}
+weak_alias (__vfork, vfork);
+#endif