@@ -8,11 +8,13 @@ use std::path::Path;
88use std:: sync:: { Arc , Mutex } ;
99
1010use 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 } ;
1212use 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 ;
1415use nix:: sys:: signal;
1516use nix:: sys:: signal:: { Signal , SIGTERM , SIGXCPU , SIGXFSZ } ;
17+ use nix:: sys:: time:: TimeValLike ;
1618use nix:: unistd:: { dup2, Pid } ;
1719
1820use 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\n wait4() = -1\n 0\n 0\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\n WEXITSTATUS() = {}\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\n WEXITSTATUS() = {}\n " , WEXITSTATUS ( stat) ) . unwrap ( )
9581 } else if WEXITSTATUS ( stat) != 0 {
9682 write ! ( & mut writer, "RE\n WIFEXITED - 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