1

我意识到使用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;
    }
}

谢谢!

4

1 回答 1

0

中断检查宏旨在由引擎“偶尔”调用,因此没有一个固定的位置,您应该期望它被调用。一个典型的解决方案是在开始操作时记录开始时间戳,并根据宏中的开始时间检查当前时间(实际上,宏调用的函数)。当差异足够大时,可以指示超时,这会导致 RangeError 传播到引擎之外。

于 2016-11-22T23:57:48.140 回答