From b231c423b59a75dd1f6d219ed9464e8edd96789c Mon Sep 17 00:00:00 2001 From: Yang Gao <6821729+criyle@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:26:22 +0800 Subject: [PATCH] judge: optimize lock (#715) --- packages/hydrojudge/src/utils.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/hydrojudge/src/utils.ts b/packages/hydrojudge/src/utils.ts index f30f99dfb..2f32e0f5c 100644 --- a/packages/hydrojudge/src/utils.ts +++ b/packages/hydrojudge/src/utils.ts @@ -1,6 +1,6 @@ import path from 'path'; import { parse } from 'shell-quote'; -import { fs, sleep } from '@hydrooj/utils'; +import { fs } from '@hydrooj/utils'; import { FormatError } from './error'; const EMPTY_STR = /^[ \r\n\t]*$/i; @@ -8,16 +8,21 @@ const EMPTY_STR = /^[ \r\n\t]*$/i; export const cmd = parse; export namespace Lock { - const data = {}; + const queue: Record void>> = {}; export async function acquire(key: string) { - // eslint-disable-next-line no-await-in-loop - while (data[key]) await sleep(100); - data[key] = true; + if (!queue[key]) { + queue[key] = []; + } else { + await new Promise((resolve) => { + queue[key].push(resolve); + }); + } } export function release(key: string) { - data[key] = false; + if (!queue[key].length) delete queue[key]; + else queue[key].shift()(); } }