]> git.kaiwu.me - njs.git/commitdiff
Allowing to create repeatable events.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 11 Sep 2018 12:34:25 +0000 (15:34 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 11 Sep 2018 12:34:25 +0000 (15:34 +0300)
njs_vm_add_event() prototype is extended to allow creating
oneshot vs repeatable events.

nginx/ngx_http_js_module.c
njs/njs.c
njs/njs.h
njs/njs_event.h
njs/njs_time.c

index d07508a5b74307243765208d0fbb3ca9a5dcb2b5..d2bbdd4611f30be2195553f351d93239d28531cd 100644 (file)
@@ -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;
index 44afa1f52a252bc4cd5fa0ecc543fb8a443357ee..98728ad6fa7478e9603b3d6424e72f0ca30894b3 100644 (file)
--- 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);
 
index b238ad8221330330673b8d04f25202a6527c8d76..149b5f59d08593e838c94734882970018406912c 100644 (file)
--- 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);
index 8db5175d05207b0771776de805ae3392a68e136e..2fc865d62a9ab2375c62230b707e7c5fa2483f65 100644 (file)
@@ -26,6 +26,7 @@ typedef struct {
     nxt_queue_link_t      link;
 
     unsigned              posted:1;
+    unsigned              once:1;
 } njs_event_t;
 
 
index 54e9ddb409549e1aeb0efa94af3c2d6ba0d8d939..0f624c2174c04293c9e8ffff97d50c473f9e0e11 100644 (file)
@@ -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) {