From 8663dd74ad0a348f20e4e5be033ba5829975f918 Mon Sep 17 00:00:00 2001 From: Chris Dearman Date: Wed, 3 Apr 2013 13:49:45 -0700 Subject: [PATCH] [MIPS] Add portable versions of wait(), wait3() and wait4() Added logging and refactored the code Change-Id: Idcd2a9e8fbe933d410e9d67f0789fa074e89baef --- .../android/libportable/arch-mips/waitpid.c | 102 +++++++++++++++--- 1 file changed, 89 insertions(+), 13 deletions(-) diff --git a/ndk/sources/android/libportable/arch-mips/waitpid.c b/ndk/sources/android/libportable/arch-mips/waitpid.c index 77e628387..bbf0a8a06 100644 --- a/ndk/sources/android/libportable/arch-mips/waitpid.c +++ b/ndk/sources/android/libportable/arch-mips/waitpid.c @@ -25,21 +25,97 @@ #define PORTABLE_TAG "waitpid_portable" #include +/* + * Converts native status information at *status to portable. + */ +static void status_ntop(int *status) +{ + int portable_status; + + ALOGV("%s(status:%p) {", __func__, + status); + + ASSERT(status != NULL); + + /* + * The interpretation of status is documented in the wait(2) manual page + * and the implementation is in bionic/libc/include/sys/wait.h + */ + if (WIFSIGNALED(*status)) + portable_status = (*status & ~0x7f) | signum_ntop(WTERMSIG(*status)); + else if (WIFSTOPPED(*status)) + portable_status = (*status & ~0xff00) | (signum_ntop(WSTOPSIG(*status)) << 8); + else + portable_status = *status; + + ALOGV("%s: (*status):0x%08x = portable_status:0x%08x", __func__, + *status, portable_status); + + *status = portable_status; + + ALOGV("%s: return; }", __func__); +} + + pid_t WRAP(waitpid)(pid_t pid, int *status, int options) { - pid_t ret; + pid_t rv; - ret = REAL(waitpid)(pid, status, options); - if (status && ret > 0) { - /* - * Status layout is identical, so just the signal - * number needs to be changed. - */ - if (WIFSIGNALED(*status)) - *status = (*status & ~0x7f) | signum_ntop(WTERMSIG(*status)); - else if (WIFSTOPPED(*status)) - *status = (*status & ~0xff00) | (signum_ntop(WSTOPSIG(*status)) << 8); - } + ALOGV("%s(pid:%d, status:%p, options:0x%x) {", __func__, + pid, status, options); - return ret; + rv = REAL(waitpid)(pid, status, options); + if (rv > 0 && status) + status_ntop(status); + + ALOGV("%s: return rv:%d; }", __func__, rv); + return rv; +} + + +pid_t WRAP(wait)(int *status) +{ + pid_t rv; + + ALOGV("%s(status:%p) {", __func__, + status); + + rv = REAL(wait)(status); + if (rv > 0 && status) + status_ntop(status); + + ALOGV("%s: return rv:%d; }", __func__, rv); + return rv; +} + + +pid_t WRAP(wait3)(int *status, int options, struct rusage *rusage) +{ + pid_t rv; + + ALOGV("%s(status:%p, options:0x%x, rusage:%p) {", __func__, + status, options, rusage); + + rv = REAL(wait3)(status, options, rusage); + if (rv > 0 && status) + status_ntop(status); + + ALOGV("%s: return rv:%d; }", __func__, rv); + return rv; +} + + +pid_t WRAP(wait4)(pid_t pid, int *status, int options, struct rusage *rusage) +{ + pid_t rv; + + ALOGV("%s(pid:%d, status:%p, options:0x%x, rusage:%p) {", __func__, + pid, status, options, rusage); + + rv = REAL(wait4)(pid, status, options, rusage); + if (rv > 0 && status) + status_ntop(status); + + ALOGV("%s: return rv:%d; }", __func__, rv); + return rv; }