diff options
Diffstat (limited to 'libc/sysdeps/linux/common/waitpid.c')
-rw-r--r-- | libc/sysdeps/linux/common/waitpid.c | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/libc/sysdeps/linux/common/waitpid.c b/libc/sysdeps/linux/common/waitpid.c index 612917fcf..902a39496 100644 --- a/libc/sysdeps/linux/common/waitpid.c +++ b/libc/sysdeps/linux/common/waitpid.c @@ -1,14 +1,52 @@ -#define wait4 __wait4 +/* vi: set sw=4 ts=4: */ +/* + * Copyright (C) 2006 Steven J. Hill <sjhill@realitydiluted.com> + * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ #include <stdlib.h> #include <sys/types.h> -#include <sys/types.h> #include <sys/wait.h> #include <sys/resource.h> +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <errno.h> +#include <sysdep-cancel.h> +#else + +libc_hidden_proto(wait4) +#endif -__pid_t attribute_hidden __waitpid(__pid_t pid, int *wait_stat, int options) +extern __typeof(waitpid) __libc_waitpid; +__pid_t __libc_waitpid(__pid_t pid, int *wait_stat, int options) { - return __wait4(pid, wait_stat, options, NULL); +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ + if (SINGLE_THREAD_P) + { +#ifdef __NR_waitpid + return INLINE_SYSCALL (waitpid, 3, pid, wait_stat, options); +#else + return INLINE_SYSCALL (wait4, 4, pid, wait_stat, options, NULL); +#endif + } + + int oldtype = LIBC_CANCEL_ASYNC (); + +#ifdef __NR_waitpid + int result = INLINE_SYSCALL (waitpid, 3, pid, wait_stat, options); +#else + int result = INLINE_SYSCALL (wait4, 4, pid, wait_stat, options, NULL); +#endif + + LIBC_CANCEL_RESET (oldtype); + + return result; +} +#else + return wait4(pid, wait_stat, options, NULL); } -strong_alias(__waitpid,waitpid) -weak_alias(__waitpid,__libc_waitpid) +#endif +libc_hidden_proto(waitpid) +weak_alias(__libc_waitpid,waitpid) +libc_hidden_weak(waitpid) |