Skip to content

Commit 0bdc72d

Browse files
committed
feat: use system wrapped Usage instead of rusage
1 parent cb4278b commit 0bdc72d

File tree

1 file changed

+13
-27
lines changed

1 file changed

+13
-27
lines changed

src/runner.rs

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ use std::path::Path;
88
use std::sync::{Arc, Mutex};
99

1010
use fork::{daemon, Fork};
11-
use nix::libc::{execvp, rusage, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO, strsignal, timeval, wait4, WEXITSTATUS, WIFEXITED, WTERMSIG};
11+
use nix::libc::{execvp, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO, strsignal, waitpid, WEXITSTATUS, WIFEXITED, WTERMSIG};
1212
use nix::sys::resource::Resource::{RLIMIT_AS, RLIMIT_CPU, RLIMIT_FSIZE, RLIMIT_NPROC};
13-
use nix::sys::resource::setrlimit;
13+
use nix::sys::resource::{getrusage, setrlimit};
14+
use nix::sys::resource::UsageWho::RUSAGE_CHILDREN;
1415
use nix::sys::signal;
1516
use nix::sys::signal::{Signal, SIGTERM, SIGXCPU, SIGXFSZ};
17+
use nix::sys::time::TimeValLike;
1618
use nix::unistd::{dup2, Pid};
1719

1820
use libnoj_rs::Judger;
@@ -48,26 +50,7 @@ fn run_inner(mut judger: impl Judger, mut env: Env) {
4850
let tle_flag_atomic = Arc::new(Mutex::new(false));
4951
let tle_flag_atomic_inner = Arc::clone(&tle_flag_atomic);
5052

51-
let mut usage = rusage {
52-
ru_utime: timeval { tv_sec: 0, tv_usec: 0 },
53-
ru_stime: timeval { tv_sec: 0, tv_usec: 0 },
54-
ru_maxrss: 0,
55-
ru_ixrss: 0,
56-
ru_idrss: 0,
57-
ru_isrss: 0,
58-
ru_minflt: 0,
59-
ru_majflt: 0,
60-
ru_nswap: 0,
61-
ru_inblock: 0,
62-
ru_oublock: 0,
63-
ru_msgsnd: 0,
64-
ru_msgrcv: 0,
65-
ru_nsignals: 0,
66-
ru_nvcsw: 0,
67-
ru_nivcsw: 0,
68-
#[cfg(any(target_env = "musl", target_env = "ohos", target_os = "emscripten"))]
69-
__reserved: [0; 16],
70-
};
53+
7154

7255
let mut stat = 0;
7356

@@ -78,19 +61,22 @@ fn run_inner(mut judger: impl Judger, mut env: Env) {
7861
*tle_flag = true;
7962
});
8063

64+
8165
unsafe {
82-
if wait4(pid, &mut stat, 0, &mut usage) == -1 {
66+
if waitpid(pid, &mut stat, 0) == -1 {
8367
write!(&mut writer, "RE\nwait4() = -1\n0\n0\n").unwrap();
8468
return;
8569
}
8670
};
8771

72+
let usage = getrusage(RUSAGE_CHILDREN).unwrap();
73+
8874
let mut tle_flag = *tle_flag_atomic.lock().unwrap();
8975

9076
if WIFEXITED(stat) || Signal::try_from(WTERMSIG(stat)).unwrap() == SIGTERM {
91-
if tle_flag || (((usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec) / 1000) as u64 > env.runtime_limit + 2) {
77+
if tle_flag || usage.user_time().num_milliseconds() > (env.runtime_limit + 2) as i64 {
9278
write!(&mut writer, "TLE\nWEXITSTATUS() = {}\n", WEXITSTATUS(stat)).unwrap();
93-
} else if (usage.ru_maxrss * 1024) as u64 > env.memory_limit {
79+
} else if (usage.max_rss() * 1024) as u64 > env.memory_limit {
9480
write!(&mut writer, "MLE\nWEXITSTATUS() = {}\n", WEXITSTATUS(stat)).unwrap()
9581
} else if WEXITSTATUS(stat) != 0 {
9682
write!(&mut writer, "RE\nWIFEXITED - WEXITSTATUS() = {}\n", WEXITSTATUS(stat)).unwrap();
@@ -119,8 +105,8 @@ fn run_inner(mut judger: impl Judger, mut env: Env) {
119105
if tle_flag {
120106
write!(&mut writer, "{}\n", env.runtime_limit + 100).unwrap();
121107
} else {
122-
write!(&mut writer, "{}\n", (usage.ru_utime.tv_sec * 1000000 + usage.ru_utime.tv_usec) / 1000).unwrap();
123-
write!(&mut writer, "{}\n", usage.ru_maxrss).unwrap();
108+
write!(&mut writer, "{}\n", usage.user_time().num_milliseconds()).unwrap();
109+
write!(&mut writer, "{}\n", usage.max_rss()).unwrap();
124110
}
125111
judger.do_after_run(&mut env);
126112
} else {

0 commit comments

Comments
 (0)