diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index c26157eda9..790b87ec67 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -133,6 +133,10 @@ pub fn getgid() -> gid_t { e(unsafe { syscall!(GETGID) }) as gid_t } +pub fn getrusage(who: c_int, r_usage: *mut rusage) -> c_int { + e(unsafe { syscall!(GETRUSAGE, who, r_usage) }) as c_int +} + pub unsafe fn gethostname(mut name: *mut c_char, len: size_t) -> c_int { // len only needs to be mutable on linux let mut len = len; diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs index 71e18d7197..10c3fc6532 100644 --- a/src/platform/src/redox/mod.rs +++ b/src/platform/src/redox/mod.rs @@ -351,6 +351,16 @@ pub fn getgid() -> gid_t { e(syscall::getgid()) as gid_t } +pub fn getrusage(who: c_int, r_usage: *mut rusage) -> c_int { + let _ = write!( + ::FileWriter(2), + "unimplemented: getrusage({}, {:p})", + who, + r_usage + ); + -1 +} + pub unsafe fn gethostname(mut name: *mut c_char, len: size_t) -> c_int { let fd = e(syscall::open("/etc/hostname", O_RDONLY)) as i32; if fd < 0 { diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs index 012749cd3f..b0bf04d5e3 100644 --- a/src/platform/src/types.rs +++ b/src/platform/src/types.rs @@ -205,3 +205,23 @@ pub struct winsize { ws_xpixel: c_ushort, ws_ypixel: c_ushort } + +#[repr(C)] +pub struct rusage { + pub ru_utime: timeval, + pub ru_stime: timeval, + pub ru_maxrss: c_long, + pub ru_ixrss: c_long, + pub ru_idrss: c_long, + pub ru_isrss: c_long, + pub ru_minflt: c_long, + pub ru_majflt: c_long, + pub ru_nswap: c_long, + pub ru_inblock: c_long, + pub ru_oublock: c_long, + pub ru_msgsnd: c_long, + pub ru_msgrcv: c_long, + pub ru_nsignals: c_long, + pub ru_nvcsw: c_long, + pub ru_nivcsw: c_long +} diff --git a/src/sys_resource/src/lib.rs b/src/sys_resource/src/lib.rs index 1dbd990842..3fde5a1fd8 100644 --- a/src/sys_resource/src/lib.rs +++ b/src/sys_resource/src/lib.rs @@ -27,6 +27,20 @@ pub struct rlimit { pub struct rusage { pub ru_utime: timeval, pub ru_stime: timeval, + pub ru_maxrss: c_long, + pub ru_ixrss: c_long, + pub ru_idrss: c_long, + pub ru_isrss: c_long, + pub ru_minflt: c_long, + pub ru_majflt: c_long, + pub ru_nswap: c_long, + pub ru_inblock: c_long, + pub ru_oublock: c_long, + pub ru_msgsnd: c_long, + pub ru_msgrcv: c_long, + pub ru_nsignals: c_long, + pub ru_nvcsw: c_long, + pub ru_nivcsw: c_long } // #[no_mangle] @@ -39,9 +53,9 @@ pub unsafe extern "C" fn getrlimit(resource: c_int, rlp: *mut rlimit) -> c_int { unimplemented!(); } -// #[no_mangle] +#[no_mangle] pub unsafe extern "C" fn getrusage(who: c_int, r_usage: *mut rusage) -> c_int { - unimplemented!(); + platform::getrusage(who, r_usage as *mut platform::types::rusage) } // #[no_mangle] diff --git a/tests/Makefile b/tests/Makefile index e54d1de7df..fdd53fa184 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -68,6 +68,7 @@ BINS=\ $(EXPECT_BINS) \ dirent \ pwd \ + resource/getrusage \ stdlib/alloc \ stdlib/bsearch \ stdlib/mktemp \ diff --git a/tests/resource/getrusage b/tests/resource/getrusage new file mode 100755 index 0000000000..0cd81a61e4 Binary files /dev/null and b/tests/resource/getrusage differ diff --git a/tests/resource/getrusage.c b/tests/resource/getrusage.c new file mode 100644 index 0000000000..a844335032 --- /dev/null +++ b/tests/resource/getrusage.c @@ -0,0 +1,33 @@ +#include +#include +#include + +void ptimeval(struct timeval* val) { + printf("{ tv_sec: %ld, tv_usec: %ld }\n", val->tv_sec, val->tv_usec); +} + +int main() { + struct rusage r_usage; + if (getrusage(RUSAGE_SELF, &r_usage) < 0) { + perror("getrusage"); + return 1; + } + printf("ru_utime:"); + ptimeval(&r_usage.ru_utime); + printf("ru_stime:"); + ptimeval(&r_usage.ru_utime); + printf("ru_maxrss: %ld\n", r_usage.ru_maxrss); + printf("ru_ixrss: %ld\n", r_usage.ru_ixrss); + printf("ru_idrss: %ld\n", r_usage.ru_idrss); + printf("ru_isrss: %ld\n", r_usage.ru_isrss); + printf("ru_minflt: %ld\n", r_usage.ru_minflt); + printf("ru_majflt: %ld\n", r_usage.ru_majflt); + printf("ru_nswap: %ld\n", r_usage.ru_nswap); + printf("ru_inblock: %ld\n", r_usage.ru_inblock); + printf("ru_oublock: %ld\n", r_usage.ru_oublock); + printf("ru_msgsnd: %ld\n", r_usage.ru_msgsnd); + printf("ru_msgrcv: %ld\n", r_usage.ru_msgrcv); + printf("ru_nsignals: %ld\n", r_usage.ru_nsignals); + printf("ru_nvcsw: %ld\n", r_usage.ru_nvcsw); + printf("ru_nivcsw: %ld\n", r_usage.ru_nivcsw); +}