From: Dmitry Volyntsev Date: Tue, 11 Sep 2018 12:34:25 +0000 (+0300) Subject: Allowing to create repeatable events. X-Git-Tag: 0.2.4~8 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=185aa911803f26622a38d7e55060da4cc9fbb664;p=njs.git Allowing to create repeatable events. njs_vm_add_event() prototype is extended to allow creating oneshot vs repeatable events. --- diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index d07508a5..d2bbdd46 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -2074,7 +2074,7 @@ ngx_http_js_subrequest(ngx_http_request_t *r, nxt_str_t *uri_arg, 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; diff --git a/njs/njs.c b/njs/njs.c index 44afa1f5..98728ad6 100644 --- a/njs/njs.c +++ b/njs/njs.c @@ -486,7 +486,7 @@ njs_vm_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *args, 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; @@ -499,6 +499,7 @@ njs_vm_add_event(njs_vm_t *vm, njs_function_t *function, event->host_event = host_ev; event->destructor = destructor; event->function = function; + event->once = once; event->posted = 0; event->nargs = 0; event->args = NULL; @@ -633,7 +634,13 @@ njs_vm_handle_events(njs_vm_t *vm) 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); diff --git a/njs/njs.h b/njs/njs.h index b238ad82..149b5f59 100644 --- a/njs/njs.h +++ b/njs/njs.h @@ -164,7 +164,7 @@ NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function, 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); diff --git a/njs/njs_event.h b/njs/njs_event.h index 8db5175d..2fc865d6 100644 --- a/njs/njs_event.h +++ b/njs/njs_event.h @@ -26,6 +26,7 @@ typedef struct { nxt_queue_link_t link; unsigned posted:1; + unsigned once:1; } njs_event_t; diff --git a/njs/njs_time.c b/njs/njs_time.c index 54e9ddb4..0f624c21 100644 --- a/njs/njs_time.c +++ b/njs/njs_time.c @@ -48,6 +48,7 @@ njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, 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) {