Как мне лучше всего установить лимит обработки на двигатель Дуктейпа?

Я понимаю использование DUK_USE_EXEC_TIMEOUT_CHECK экспериментальный (по состоянию на 1.5), но мне неясно, как его лучше всего использовать. То, что я пытаюсь сделать, - это установить жесткое ограничение на выполнение кода операции, чтобы не допустить, чтобы плохие сценарии убивали мой процесс с помощью бесконечных циклов, больших блоков обработки и т. Д. Я определил то, что считаю подходящим, а именно:

#define DUK_OPT_INTERRUPT_COUNTER
#define DUK_OPT_EXEC_TIMEOUT_CHECK duk_my_exec_timeout

int duk_my_exec_timeout( void *udata ) {
    return stop_processing ? 1 : 0;
}

Проблема: у меня много контекстов, но udata недостаточно, чтобы отличить их настолько близко, насколько я могу судить. Это не может быть необходимым для моих нужд, хотя.

Проблема: функция вызывается в неожиданных местах, например, во время duk_create_heap и даже просто duk_peval_string звонки, но я не знаю почему.

Я взломал вместе то, что, как мне кажется, меня сейчас устраивает, изменив duk__executor_interrupt код для передачи в потоке / контексте interrupt_init член вроде так:

if (DUK_USE_EXEC_TIMEOUT_CHECK(thr->interrupt_init, thr->heap->heap_udata)) {
    ...
}

и кажется, что когда он ненулевой, я достиг некоторого внутреннего предела обработки кода операции. Это звучит правильно?

Моя процедура тайм-аута выглядит так:

int duk_my_exec_timeout( int interrupt, void *udata ) {
    if ( interrupt ) {
        return 1;
    }
    else {
        return 0;
    }
}

Спасибо!

1 ответ

Макрос проверки прерывания предназначен для "случайного" вызова механизмом, поэтому не существует фиксированного места, где вы должны ожидать его вызова. Типичное решение - записать временную метку запуска при запуске операции и сравнить текущее время с временем начала в макросе (на практике это функция, вызываемая макросом). Когда разница достаточно велика, можно указать тайм-аут, из-за которого RangeError распространяется из ядра.

Другие вопросы по тегам