Implement getrusage on linux
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -68,6 +68,7 @@ BINS=\
|
||||
$(EXPECT_BINS) \
|
||||
dirent \
|
||||
pwd \
|
||||
resource/getrusage \
|
||||
stdlib/alloc \
|
||||
stdlib/bsearch \
|
||||
stdlib/mktemp \
|
||||
|
||||
Executable
BIN
Binary file not shown.
@@ -0,0 +1,33 @@
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user