code_executor/runner/
metrics.rs1use 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}