mirror of
https://github.com/MeiK2333/river.git
synced 2025-11-04 14:49:40 +08:00
Update
This commit is contained in:
parent
86395283d0
commit
a4fa159370
@ -17,6 +17,7 @@ pub enum Error {
|
|||||||
OsStringToStringError(OsString),
|
OsStringToStringError(OsString),
|
||||||
RemoveFileError(PathBuf),
|
RemoveFileError(PathBuf),
|
||||||
UnknownRequestData,
|
UnknownRequestData,
|
||||||
|
RequestDataNotFound,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Result<T> = result::Result<T, Error>;
|
pub type Result<T> = result::Result<T, Error>;
|
||||||
|
|||||||
@ -68,6 +68,7 @@ pub async fn judger(request: &JudgeRequest, data: &JudgeData, path: &Path) -> Re
|
|||||||
|
|
||||||
pub async fn compile(request: &JudgeRequest, data: &CompileData, path: &Path) -> Result<JudgeResponse> {
|
pub async fn compile(request: &JudgeRequest, data: &CompileData, path: &Path) -> Result<JudgeResponse> {
|
||||||
let mut resp = JudgeResponse::new();
|
let mut resp = JudgeResponse::new();
|
||||||
|
resp.status = JudgeStatus::Ended as i32;
|
||||||
// 写入代码
|
// 写入代码
|
||||||
let filename = match Language::from_i32(request.language) {
|
let filename = match Language::from_i32(request.language) {
|
||||||
Some(Language::C) => "main.c",
|
Some(Language::C) => "main.c",
|
||||||
@ -105,9 +106,8 @@ pub async fn compile(request: &JudgeRequest, data: &CompileData, path: &Path) ->
|
|||||||
let status = process.await?;
|
let status = process.await?;
|
||||||
if status.exit_code != 0 {
|
if status.exit_code != 0 {
|
||||||
resp.set_process_status(&status);
|
resp.set_process_status(&status);
|
||||||
resp.errmsg = status.stdout;
|
resp.errmsg = format!("{}{}", status.stdout, status.stderr);
|
||||||
resp.result = JudgeResult::CompileError as i32;
|
resp.result = JudgeResult::CompileError as i32;
|
||||||
resp.status = JudgeStatus::Ended as i32;
|
|
||||||
}
|
}
|
||||||
Ok(resp)
|
Ok(resp)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -54,6 +54,7 @@ impl River for RiverService {
|
|||||||
let result = match &req.data {
|
let result = match &req.data {
|
||||||
Some(Data::CompileData(data)) => judger::compile(&req, &data, &pwd.path()).await,
|
Some(Data::CompileData(data)) => judger::compile(&req, &data, &pwd.path()).await,
|
||||||
Some(Data::JudgeData(data)) => judger::judger(&req, &data, &pwd.path()).await,
|
Some(Data::JudgeData(data)) => judger::judger(&req, &data, &pwd.path()).await,
|
||||||
|
None => Err(error::Error::RequestDataNotFound),
|
||||||
_ => Err(error::Error::UnknownRequestData),
|
_ => Err(error::Error::UnknownRequestData),
|
||||||
};
|
};
|
||||||
let result = match result {
|
let result = match result {
|
||||||
|
|||||||
@ -44,6 +44,48 @@ impl Process {
|
|||||||
pub fn set_pid(&mut self, pid: i32) {
|
pub fn set_pid(&mut self, pid: i32) {
|
||||||
self.pid = pid;
|
self.pid = pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
// 为进程设置 stdin 的数据
|
||||||
|
pub fn set_stdin(in_data: &Vec<u8>) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
// 从 stdout 中读取指定长度的内容
|
||||||
|
pub fn read_stdout(len: i32) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
// 从 stderr 中读取指定长度的内容
|
||||||
|
pub fn read_stderr(len: i32) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Process {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if self.pid > 0 {
|
||||||
|
let mut status = 0;
|
||||||
|
let pid;
|
||||||
|
unsafe {
|
||||||
|
pid = libc::waitpid(self.pid, &mut status, libc::WNOHANG);
|
||||||
|
}
|
||||||
|
// > 0: 对应子进程退出
|
||||||
|
// = 0: 对应子进程存在但未退出
|
||||||
|
// 如果在运行过程中上层异常中断,则需要 kill 子进程并回收资源
|
||||||
|
if pid >= 0 {
|
||||||
|
unsafe {
|
||||||
|
libc::kill(self.pid, 9);
|
||||||
|
libc::waitpid(self.pid, &mut status, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Future for Process {
|
impl Future for Process {
|
||||||
@ -65,7 +107,7 @@ impl Future for Process {
|
|||||||
run(process_clone);
|
run(process_clone);
|
||||||
} else if pid > 0 {
|
} else if pid > 0 {
|
||||||
tx.send(pid).unwrap();
|
tx.send(pid).unwrap();
|
||||||
let status = wait(pid, process_clone.workdir);
|
let status = wait(pid, &process_clone.workdir);
|
||||||
let status_tx = process_clone.tx.lock().unwrap();
|
let status_tx = process_clone.tx.lock().unwrap();
|
||||||
status_tx.send(status).unwrap();
|
status_tx.send(status).unwrap();
|
||||||
waker.wake();
|
waker.wake();
|
||||||
@ -190,7 +232,7 @@ fn run(process: Process) {
|
|||||||
// 子进程里崩溃也无法返回,崩溃就直接崩溃了
|
// 子进程里崩溃也无法返回,崩溃就直接崩溃了
|
||||||
let exec_args = ExecArgs::build(&process.cmd).unwrap();
|
let exec_args = ExecArgs::build(&process.cmd).unwrap();
|
||||||
// 修改工作目录
|
// 修改工作目录
|
||||||
env::set_current_dir(process.workdir).unwrap();
|
env::set_current_dir(&process.workdir).unwrap();
|
||||||
let mut rl = libc::rlimit {
|
let mut rl = libc::rlimit {
|
||||||
rlim_cur: 0,
|
rlim_cur: 0,
|
||||||
rlim_max: 0,
|
rlim_max: 0,
|
||||||
@ -208,7 +250,7 @@ fn run(process: Process) {
|
|||||||
};
|
};
|
||||||
unsafe {
|
unsafe {
|
||||||
// 重定向文件描述符
|
// 重定向文件描述符
|
||||||
if let Some(file) = process.stdin_file {
|
if let Some(file) = &process.stdin_file {
|
||||||
let filename = file.to_str().unwrap();
|
let filename = file.to_str().unwrap();
|
||||||
dup(&filename, libc::STDIN_FILENO, libc::O_RDONLY, 0o644)
|
dup(&filename, libc::STDIN_FILENO, libc::O_RDONLY, 0o644)
|
||||||
}
|
}
|
||||||
@ -274,7 +316,7 @@ unsafe fn dup(filename: &str, to: libc::c_int, flag: libc::c_int, mode: libc::c_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wait(pid: i32, workdir: PathBuf) -> ProcessStatus {
|
fn wait(pid: i32, workdir: &PathBuf) -> ProcessStatus {
|
||||||
let start = SystemTime::now();
|
let start = SystemTime::now();
|
||||||
let mut status = 0;
|
let mut status = 0;
|
||||||
let mut rusage = libc::rusage {
|
let mut rusage = libc::rusage {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user