code_executor/runner/
metrics.rs

1use std::{ffi::c_int, time::Duration};
2
3use nix::libc::{self, rusage};
4
5pub fn get_default_rusage() -> rusage {
6    rusage {
7        ru_utime: libc::timeval {
8            tv_sec: 0,
9            tv_usec: 0,
10        },
11        ru_stime: libc::timeval {
12            tv_sec: 0,
13            tv_usec: 0,
14        },
15        ru_maxrss: 0,
16        ru_ixrss: 0,
17        ru_idrss: 0,
18        ru_isrss: 0,
19        ru_minflt: 0,
20        ru_majflt: 0,
21        ru_nswap: 0,
22        ru_inblock: 0,
23        ru_oublock: 0,
24        ru_msgsnd: 0,
25        ru_msgrcv: 0,
26        ru_nsignals: 0,
27        ru_nvcsw: 0,
28        ru_nivcsw: 0,
29    }
30}
31
32#[derive(Debug, Default)]
33pub struct Rusage {
34    pub user_time: Duration,
35    pub system_time: Duration,
36    pub max_rss: i64,
37    pub page_faults: i64,
38    pub involuntary_context_switches: i64,
39    pub voluntary_context_switches: i64,
40}
41
42impl From<rusage> for Rusage {
43    fn from(rusage: rusage) -> Self {
44        Self {
45            user_time: Duration::new(
46                rusage.ru_utime.tv_sec as u64,
47                rusage.ru_utime.tv_usec as u32 * 1000,
48            ),
49            system_time: Duration::new(
50                rusage.ru_stime.tv_sec as u64,
51                rusage.ru_stime.tv_usec as u32 * 1000,
52            ),
53            max_rss: rusage.ru_maxrss,
54            page_faults: rusage.ru_majflt,
55            involuntary_context_switches: rusage.ru_nivcsw,
56            voluntary_context_switches: rusage.ru_nvcsw,
57        }
58    }
59}
60
61#[derive(Debug, PartialEq, Eq)]
62pub enum Output {
63    CompileTimeError(String),
64    RunTimeError(String),
65    Success(String),
66}
67
68impl Default for Output {
69    fn default() -> Self {
70        Output::CompileTimeError(Default::default())
71    }
72}
73
74#[derive(Debug, Default)]
75pub struct Metrics {
76    pub exit_status: c_int,
77    pub exit_signal: c_int,
78    pub exit_code: c_int,
79    pub real_time_cost: Duration,
80    pub resource_usage: Rusage,
81    pub output: Output,
82}