return NJS_ERROR;
}
- vm_event = njs_vm_add_event(ctx->vm, callback, NULL, NULL);
+ vm_event = njs_vm_add_event(ctx->vm, callback, 1, NULL, NULL);
if (vm_event == NULL) {
njs_vm_error(ctx->vm, "internal error");
return NJS_ERROR;
njs_vm_event_t
-njs_vm_add_event(njs_vm_t *vm, njs_function_t *function,
+njs_vm_add_event(njs_vm_t *vm, njs_function_t *function, nxt_uint_t once,
njs_host_event_t host_ev, njs_event_destructor destructor)
{
njs_event_t *event;
event->host_event = host_ev;
event->destructor = destructor;
event->function = function;
+ event->once = once;
event->posted = 0;
event->nargs = 0;
event->args = NULL;
ev = nxt_queue_link_data(link, njs_event_t, link);
- njs_del_event(vm, ev, NJS_EVENT_DELETE);
+ if (ev->once) {
+ njs_del_event(vm, ev, NJS_EVENT_DELETE);
+
+ } else {
+ ev->posted = 0;
+ nxt_queue_remove(&ev->link);
+ }
ret = njs_vm_call(vm, ev->function, ev->args, ev->nargs);
const njs_value_t *args, nxt_uint_t nargs);
NXT_EXPORT njs_vm_event_t njs_vm_add_event(njs_vm_t *vm,
- njs_function_t *function, njs_host_event_t host_ev,
+ njs_function_t *function, nxt_uint_t once, njs_host_event_t host_ev,
njs_event_destructor destructor);
NXT_EXPORT void njs_vm_del_event(njs_vm_t *vm, njs_vm_event_t vm_event);
NXT_EXPORT nxt_int_t njs_vm_pending(njs_vm_t *vm);
nxt_queue_link_t link;
unsigned posted:1;
+ unsigned once:1;
} njs_event_t;
event->destructor = ops->clear_timer;
event->function = args[1].data.u.function;
event->nargs = (nargs >= 3) ? nargs - 3 : 0;
+ event->once = 1;
event->posted = 0;
if (event->nargs != 0) {