-
Notifications
You must be signed in to change notification settings - Fork 0
/
runner_base.hpp
61 lines (47 loc) · 1.22 KB
/
runner_base.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef __RUNER_BASE_HPP__
#define __RUNER_BASE_HPP__
#include <sys/resource.h>
#include <unistd.h>
#include <stdint.h>
#include <condition_variable>
#include <thread>
#include <string>
#include "common.hpp"
#define FILE_CHECK_SYSCALL 0x7fffffffL
class runner_base
{
public:
struct result_t{
int32_t timeCost, memoryCost, result, returnCode;
char commit[128];
};
runner_base();
runner_base(const runner_base&) = delete;
runner_base& operator=(const runner_base&) = delete;
result_t* run();
private:
void _forkChild();
inline void _continueLoop();
inline void _stopLoop();
inline void _peekReg(struct user_regs_struct*);
bool _checkExit(int);
void _getStringArg(long, long*);
bool _checkSyscall(struct user_regs_struct*);
void _work();
void _summarize();
void _alarmTimer();
void _updateTimeUsage();
inline bool _updateMemUsage();
bool _intoCall = 1;
pid_t _childpid = 0;
struct rusage _ur;
condition_variable_any _cv;
mutex _cv_m;
bool _running = 0;
protected:
virtual void _execTarget() = 0;
virtual bool _checkFilePrivilege(const char*) = 0;
int32_t _syscallQuota[syscallMaxNum];
result_t _res;
};
#endif