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