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:
@@ -25,21 +25,97 @@
|
|||||||
#define PORTABLE_TAG "waitpid_portable"
|
#define PORTABLE_TAG "waitpid_portable"
|
||||||
#include <log_portable.h>
|
#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 WRAP(waitpid)(pid_t pid, int *status, int options)
|
||||||
{
|
{
|
||||||
pid_t ret;
|
pid_t rv;
|
||||||
|
|
||||||
ret = REAL(waitpid)(pid, status, options);
|
ALOGV("%s(pid:%d, status:%p, options:0x%x) {", __func__,
|
||||||
if (status && ret > 0) {
|
pid, status, options);
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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