124 lines
3.0 KiB
C
124 lines
3.0 KiB
C
|
/* Test 75 - getrusage functionality test.
|
||
|
*/
|
||
|
|
||
|
#include <sys/resource.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <stdio.h>
|
||
|
#include <assert.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/wait.h>
|
||
|
#include <unistd.h>
|
||
|
|
||
|
#include "common.h"
|
||
|
|
||
|
#define CHECK_ZERO_FIELD(rusage, field) \
|
||
|
if (rusage.field != 0) \
|
||
|
em(1, #field " must be zero");
|
||
|
|
||
|
#define CHECK_NOT_ZERO_FIELD(rusage, field) \
|
||
|
if (rusage.field == 0) \
|
||
|
em(1, #field " can't be zero");
|
||
|
|
||
|
#define CHECK_EQUAL_FIELD(rusage1, rusage2, field) \
|
||
|
if (rusage1.field != rusage2.field) \
|
||
|
em(1, #field " of " #rusage1 " doesn't equal to " \
|
||
|
#field " of " #rusage2);
|
||
|
|
||
|
static void
|
||
|
spin(void)
|
||
|
{
|
||
|
struct timeval start_time;
|
||
|
struct timeval end_time;
|
||
|
unsigned int loop = 0;
|
||
|
if (gettimeofday(&start_time, NULL) == -1) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
end_time = start_time;
|
||
|
do {
|
||
|
if ((++loop % 3000000000) == 0) {
|
||
|
if (gettimeofday(&end_time, NULL) == -1) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
} while (start_time.tv_sec + 10 > end_time.tv_sec);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
struct rusage r_usage1;
|
||
|
struct rusage r_usage2;
|
||
|
struct rusage r_usage3;
|
||
|
pid_t child;
|
||
|
int status = 0;
|
||
|
start(75);
|
||
|
if ((getrusage(RUSAGE_SELF + 1, &r_usage1) != -1 || errno != EINVAL) ||
|
||
|
(getrusage(RUSAGE_CHILDREN - 1, &r_usage1) != -1 ||
|
||
|
errno != EINVAL) || (getrusage(RUSAGE_SELF, NULL) != -1 ||
|
||
|
errno != EFAULT)) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
spin();
|
||
|
if (getrusage(RUSAGE_SELF, &r_usage1) != 0) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage1, ru_utime.tv_sec);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage1, ru_maxrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage1, ru_ixrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage1, ru_idrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage1, ru_isrss);
|
||
|
if (getrusage(RUSAGE_CHILDREN, &r_usage2) != 0) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage2, ru_maxrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage2, ru_ixrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage2, ru_idrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage2, ru_isrss);
|
||
|
CHECK_EQUAL_FIELD(r_usage1, r_usage2, ru_ixrss);
|
||
|
CHECK_EQUAL_FIELD(r_usage1, r_usage2, ru_idrss);
|
||
|
CHECK_EQUAL_FIELD(r_usage1, r_usage2, ru_isrss);
|
||
|
if ((child = fork()) == 0) {
|
||
|
/*
|
||
|
* We cannot do this part of the test in the parent, since
|
||
|
* start() calls system() which spawns a child process.
|
||
|
*/
|
||
|
if (getrusage(RUSAGE_CHILDREN, &r_usage1) != 0) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
CHECK_ZERO_FIELD(r_usage1, ru_utime.tv_sec);
|
||
|
CHECK_ZERO_FIELD(r_usage1, ru_utime.tv_usec);
|
||
|
spin();
|
||
|
exit(0);
|
||
|
} else {
|
||
|
if (child != waitpid(child, &status, 0)) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
if (WEXITSTATUS(status) != 0) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
if (getrusage(RUSAGE_CHILDREN, &r_usage3) != 0) {
|
||
|
e(1);
|
||
|
exit(1);
|
||
|
}
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage3, ru_utime.tv_sec);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage3, ru_maxrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage3, ru_ixrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage3, ru_idrss);
|
||
|
CHECK_NOT_ZERO_FIELD(r_usage3, ru_isrss);
|
||
|
CHECK_EQUAL_FIELD(r_usage1, r_usage3, ru_ixrss);
|
||
|
CHECK_EQUAL_FIELD(r_usage1, r_usage3, ru_idrss);
|
||
|
CHECK_EQUAL_FIELD(r_usage1, r_usage3, ru_isrss);
|
||
|
}
|
||
|
quit();
|
||
|
|
||
|
return 0;
|
||
|
}
|