diff options
author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-08-24 02:58:45 +0000 |
---|---|---|
committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-08-24 02:58:45 +0000 |
commit | 01f422c12f5799a44832eb26967a906edfc2ba55 (patch) | |
tree | 1e8bdcaab1f4da088cc1c490bf96c361a663e0c4 /libc/sysdeps/linux/common/waitpid.c | |
parent | d2db9bdb4c79afcd4b09353346cd4eaf63b6cd2c (diff) | |
download | uClibc-alpine-01f422c12f5799a44832eb26967a906edfc2ba55.tar.bz2 uClibc-alpine-01f422c12f5799a44832eb26967a906edfc2ba55.tar.xz |
Well, this is everything for my NPTL implementation. The 'uClibc-nptl' branch is now the exact code that I have. I am going to re-run tests now to verify everything one more time. The next step after that is to merge from trunk with the latest stuff from Mike and Peter.
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) |