瀏覽代碼

Implement getrusage on linux

jD91mZM2 6 年之前
父節點
當前提交
3c88056f9d

+ 4 - 0
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;

+ 10 - 0
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 {

+ 20 - 0
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
+}

+ 16 - 2
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]

+ 1 - 0
tests/Makefile

@@ -68,6 +68,7 @@ BINS=\
 	$(EXPECT_BINS) \
 	dirent \
 	pwd \
+	resource/getrusage \
 	stdlib/alloc \
 	stdlib/bsearch \
 	stdlib/mktemp \

二進制
tests/resource/getrusage


+ 33 - 0
tests/resource/getrusage.c

@@ -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);
+}