Merge "[MIPS] Add portable versions of wait(), wait3() and wait4()"
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user