Как мне лучше всего установить лимит обработки на двигатель Дуктейпа?
Я понимаю использование 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 распространяется из ядра.