Implement getrusage on linux

This commit is contained in:
jD91mZM2
2018-07-27 19:54:30 +02:00
parent 193328952d
commit 3c88056f9d
7 changed files with 84 additions and 2 deletions
+4
View File
@@ -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;
+10
View File
@@ -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 {
+20
View File
@@ -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
}
+16 -2
View File
@@ -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]
+1
View File
@@ -68,6 +68,7 @@ BINS=\
$(EXPECT_BINS) \
dirent \
pwd \
resource/getrusage \
stdlib/alloc \
stdlib/bsearch \
stdlib/mktemp \
BIN
View File
Binary file not shown.
+33
View File
@@ -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);
}