am 703b2565: Merge "[MIPS] Add portable versions of wait(), wait3() and wait4()"

* commit '703b2565f27641805adc399a65a183773b9c74d8':
  [MIPS] Add portable versions of wait(), wait3() and wait4()
This commit is contained in:
Andrew Hsieh
2013-04-06 18:27:10 -07:00
committed by Android Git Automerger

View File

@@ -25,21 +25,97 @@
#define PORTABLE_TAG "waitpid_portable"
#include <log_portable.h>
/*
* 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;
}