mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 09:36:08 +08:00
judge: differentiate exit code with signalled (#664)
This commit is contained in:
1 parent
659bd9f4aa
commit
efd9fc5c13
5 files changed
+16
-8
No files matched your search
@@ -26,7 +26,7 @@ function judgeCase(c: NormalizedCase) {
|
||||
},
|
||||
);
|
||||
const {
|
||||
code, time, memory, fileIds,
|
||||
code, signalled, time, memory, fileIds,
|
||||
} = res;
|
||||
let { status } = res;
|
||||
let message: any = '';
|
||||
@@ -50,7 +50,7 @@ function judgeCase(c: NormalizedCase) {
|
||||
}));
|
||||
}
|
||||
} else if (status === STATUS.STATUS_RUNTIME_ERROR && code) {
|
||||
if (code < 32) message = signals[code];
|
||||
if (code < 32 && signalled) message = signals[code];
|
||||
else message = { message: 'Your program returned {0}.', params: [code] };
|
||||
}
|
||||
await Promise.allSettled(Object.values(res.fileIds).map((id) => del(id)));
|
||||
|
||||
@@ -51,7 +51,9 @@ export async function judge(ctx: Context) {
|
||||
cacheStdoutAndStderr: true,
|
||||
},
|
||||
);
|
||||
const { code, time, memory } = res;
|
||||
const {
|
||||
code, signalled, time, memory,
|
||||
} = res;
|
||||
let { status } = res;
|
||||
let message: any = '';
|
||||
if (status === STATUS.STATUS_ACCEPTED) {
|
||||
@@ -73,7 +75,7 @@ export async function judge(ctx: Context) {
|
||||
}));
|
||||
}
|
||||
} else if (status === STATUS.STATUS_RUNTIME_ERROR && code) {
|
||||
if (code < 32) message = signals[code];
|
||||
if (code < 32 && signalled) message = signals[code];
|
||||
else message = { message: 'Your program returned {0}.', params: [code] };
|
||||
}
|
||||
await Promise.allSettled(Object.values(res.fileIds).map((id) => del(id)));
|
||||
|
||||
@@ -13,7 +13,9 @@ function judgeCase(c: NormalizedCase) {
|
||||
return async (ctx: Context, ctxSubtask: ContextSubTask) => {
|
||||
ctx.executeInteractor.copyIn.in = c.input ? { src: c.input } : { content: '' };
|
||||
ctx.executeInteractor.copyIn.out = c.output ? { src: c.output } : { content: '' };
|
||||
const [{ code, time, memory }, resInteractor] = await runPiped(
|
||||
const [{
|
||||
code, signalled, time, memory,
|
||||
}, resInteractor] = await runPiped(
|
||||
{
|
||||
execute: ctx.executeUser.execute,
|
||||
copyIn: ctx.executeUser.copyIn,
|
||||
@@ -39,7 +41,7 @@ function judgeCase(c: NormalizedCase) {
|
||||
status = STATUS.STATUS_MEMORY_LIMIT_EXCEEDED;
|
||||
} else if ((code && code !== 13/* Broken Pipe */) || (code === 13 && !resInteractor.code)) {
|
||||
status = STATUS.STATUS_RUNTIME_ERROR;
|
||||
if (code < 32) message = signals[code];
|
||||
if (code < 32 && signalled) message = signals[code];
|
||||
else message = { message: 'Your program returned {0}.', params: [code] };
|
||||
} else {
|
||||
const result = parse(resInteractor.stderr, c.score);
|
||||
|
||||
@@ -57,7 +57,9 @@ export const judge = async (ctx: Context) => {
|
||||
},
|
||||
1,
|
||||
);
|
||||
const { code, time, memory } = res;
|
||||
const {
|
||||
code, signalled, time, memory,
|
||||
} = res;
|
||||
let { status } = res;
|
||||
const message: string[] = [];
|
||||
if (time > parseTimeMS(ctx.config.time || '1s')) {
|
||||
@@ -66,7 +68,7 @@ export const judge = async (ctx: Context) => {
|
||||
status = STATUS.STATUS_MEMORY_LIMIT_EXCEEDED;
|
||||
} else if (code) {
|
||||
status = STATUS.STATUS_RUNTIME_ERROR;
|
||||
if (code < 32) message.push(`ExitCode: ${code} (${signals[code]})`);
|
||||
if (code < 32 && signalled) message.push(`ExitCode: ${code} (${signals[code]})`);
|
||||
else message.push(`ExitCode: ${code}`);
|
||||
}
|
||||
message.push(res.stdout, res.stderr);
|
||||
|
||||
@@ -45,6 +45,7 @@ interface Parameter {
|
||||
interface SandboxAdaptedResult {
|
||||
status: number;
|
||||
code: number;
|
||||
signalled: boolean;
|
||||
/** in miliseconds */
|
||||
time: number;
|
||||
/** in kilobytes */
|
||||
@@ -114,6 +115,7 @@ async function adaptResult(result: SandboxResult, params: Parameter): Promise<Sa
|
||||
// FIXME: Signalled?
|
||||
const ret: SandboxAdaptedResult = {
|
||||
status: statusMap.get(result.status) || STATUS.STATUS_ACCEPTED,
|
||||
signalled: result.status === SandboxStatus.Signalled,
|
||||
time: result.time / 1000000 / rate,
|
||||
memory: result.memory / 1024,
|
||||
files: result.files,
|
||||
|
||||
Reference in new issue
Block a user