Files
mckernel/test/mng_mod/issues/1032-34/x86_64/CT_007.c
Shiratori, Takehiro ec844bb6e3 Test "fix: Bug for getrusage" on arm64
The following test set:
  fix: Bug for getrusage return incorrect ru_maxrss
  fix: Bug for getrusage(RUSAGE_CHILDREN) return parent info (POSTK_DEBUG_TEMP_FIX_72)
  fix: Bug for getrusage often return incorrect ru_stime

Change-Id: I6734b1e34565d5d2715f9901a04ba5b6f0278032
Refs: #1032
Refs: #1033
Refs: #1034
2018-12-05 01:58:44 +00:00

95 lines
2.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include "./test_chk.h"
#include "./test_rusage.h"
#define TEST_NAME "CT_007"
int main(int argc, char* argv[])
{
int rc;
char *buf = NULL, *buf_child = NULL;
struct rusage cur_rusage;
long cur_utime, cur_stime, cur_maxrss;
long delta_utime, delta_stime, delta_maxrss;
long prev_utime = 0, prev_stime = 0, prev_maxrss = 0;
int pid, status;
printf("---- just started ----\n");
/* check rusage 1st */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 1st");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_maxrss != 0,
" maxrss: %d KB (+ %d KB)", cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("---- fork child process ----\n");
pid = fork();
CHKANDJUMP(pid == -1, "fork");
if (pid == 0) { /* child */
/* add utime 1sec */
printf(" ---- add utime 1sec in child ----\n");
add_utime(1);
/* mmap 16MB */
printf(" ---- mmap and access 16MB (%d KB) in child ----\n", 16 * 1024);
buf = mmap(0, 16 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf, "mmap");
memset(buf, 0xff, 16 * M_BYTE);
/* munmap 16MB */
printf(" ---- munmap 16MB (%d KB) in child ----\n", 16 * 1024);
munmap(buf, 16 * M_BYTE);
printf(" ---- child process exit ----\n");
_exit(123);
} else { /* parent */
/* mmap 32MB */
printf("---- mmap and access 32MB (%d KB) in parent ----\n", 32 * 1024);
buf = mmap(0, 32 * M_BYTE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
CHKANDJUMP(!buf, "mmap");
memset(buf, 0xff, 32 * M_BYTE);
/* munmap 32MB */
printf("---- munmap 32MB (%d KB) in parent ----\n", 32 * 1024);
munmap(buf, 32 * M_BYTE);
printf("---- wait child's exit ----\n");
rc = waitpid(pid, &status, 0);
CHKANDJUMP(rc == -1, "waitpid");
}
/* check rusage 2nd */
rc = getrusage(RUSAGE_CHILDREN, &cur_rusage);
CHKANDJUMP(rc == -1, "getrusage 2nd");
cur_maxrss = get_rusage_maxrss(&cur_rusage);
delta_maxrss = cur_maxrss - prev_maxrss;
printf("[ RUSAGE_CHILDREN ]\n");
OKNG(cur_maxrss < 16 * 1024 || cur_maxrss > 32 * 1024,
" maxrss: %d KB (+ %d KB) <- 子プロセス終了後に更新 (プロセス生成時の56M + mmapでの16M)",
cur_maxrss, delta_maxrss);
prev_maxrss = cur_maxrss;
printf("*** %s PASS\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}