فهرست منبع

clone: make clone a wrapper around __clone

The architecture-specific assembly versions of clone did not set errno on
failure, which is inconsistent with glibc.  __clone still returns the error
via its return value, and clone is now a wrapper that sets errno as needed.
The public clone has also been moved to src/linux, as it's not directly
related to the pthreads API.

__clone is called by pthread_create, which does not report errors via
errno.  Though not strictly necessary, it's nice to avoid clobbering errno
here.
Bobby Bingham 11 سال پیش
والد
کامیت
fdf5f1b131
6فایلهای تغییر یافته به همراه22 افزوده شده و 18 حذف شده
  1. 19 0
      src/linux/clone.c
  2. 0 3
      src/thread/arm/clone.s
  3. 2 5
      src/thread/clone.c
  4. 0 3
      src/thread/i386/clone.s
  5. 1 4
      src/thread/microblaze/clone.s
  6. 0 3
      src/thread/x86_64/clone.s

+ 19 - 0
src/linux/clone.c

@@ -0,0 +1,19 @@
+#include <stdarg.h>
+#include <unistd.h>
+#include "pthread_impl.h"
+#include "syscall.h"
+
+int clone(int (*func)(void *), void *stack, int flags, void *arg, ...)
+{
+	va_list ap;
+	pid_t *ptid, *ctid;
+	void  *tls;
+
+	va_start(ap, arg);
+	ptid = va_arg(ap, pid_t *);
+	tls  = va_arg(ap, void *);
+	ctid = va_arg(ap, pid_t *);
+	va_end(ap);
+
+	return __syscall_ret(__clone(func, stack, flags, arg, ptid, tls, ctid));
+}

+ 0 - 3
src/thread/arm/clone.s

@@ -1,10 +1,7 @@
 .text
 .global __clone
-.weak clone
 .type   __clone,%function
-.type   clone,%function
 __clone:
-clone:
 	stmfd sp!,{r4,r5,r6,r7}
 	mov r7,#120
 	mov r6,r3

+ 2 - 5
src/thread/clone.c

@@ -1,10 +1,7 @@
 #include <errno.h>
-#include "libc.h"
+#include "pthread_impl.h"
 
 int __clone(int (*func)(void *), void *stack, int flags, void *arg, ...)
 {
-	errno = ENOSYS;
-	return -1;
+	return -ENOSYS;
 }
-
-weak_alias(__clone, clone);

+ 0 - 3
src/thread/i386/clone.s

@@ -1,10 +1,7 @@
 .text
 .global __clone
-.weak clone
 .type   __clone,@function
-.type   clone,@function
 __clone:
-clone:
 	push %ebp
 	mov %esp,%ebp
 	push %ebx

+ 1 - 4
src/thread/microblaze/clone.s

@@ -1,14 +1,11 @@
 .global __clone
-.weak clone
 .type   __clone,@function
-.type   clone,@function
 
 # r5, r6, r7, r8, r9, r10, stack
 # fn, st, fl, ar, pt, tl, ct
 # fl, st, __, pt, ct, tl
 
 __clone:
-clone:
 	andi    r6, r6, -16
 	addi    r6, r6, -16
 	swi     r5, r6, 0
@@ -23,7 +20,7 @@ clone:
 	beqi	r3, 1f
 	rtsd    r15, 8
 	nop
-	
+
 1:	lwi     r3, r1, 0
 	lwi     r5, r1, 4
 	brald   r15, r3

+ 0 - 3
src/thread/x86_64/clone.s

@@ -1,10 +1,7 @@
 .text
 .global __clone
-.weak clone
 .type   __clone,@function
-.type   clone,@function
 __clone:
-clone:
 	xor %eax,%eax
 	mov $56,%al
 	mov %rdi,%r11