]> git.kaiwu.me - njs.git/commitdiff
Added setImmediate().
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 28 Dec 2018 09:44:56 +0000 (12:44 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 28 Dec 2018 09:44:56 +0000 (12:44 +0300)
njs/njs.c
njs/njs.h
njs/njs_builtin.c
njs/njs_event.h
njs/njs_generator.c
njs/njs_lexer_keyword.c
njs/njs_parser.c
njs/njs_parser.h
njs/njs_time.c
njs/njs_time.h
njs/njs_vm.h

index b88f497e52d68d30837d4fe14d21eb22017974ca..bf7ee18681bf8773f41c90209f4f2dde0c411443 100644 (file)
--- a/njs/njs.c
+++ b/njs/njs.c
@@ -521,7 +521,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, nxt_uint_t once,
-    njs_host_event_t host_ev, njs_event_destructor destructor)
+    njs_host_event_t host_ev, njs_event_destructor_t destructor)
 {
     njs_event_t  *event;
 
index ac08842768f213f97cd9ba1d956afbd058a5a0bf..638b886de98f5b5e15e6f8e2a549272c503c30ad 100644 (file)
--- a/njs/njs.h
+++ b/njs/njs.h
@@ -125,15 +125,15 @@ typedef void *                      njs_vm_event_t;
 typedef void *                      njs_host_event_t;
 typedef void *                      njs_external_ptr_t;
 
-typedef njs_host_event_t (*njs_set_timer)(njs_external_ptr_t external,
+typedef njs_host_event_t (*njs_set_timer_t)(njs_external_ptr_t external,
     uint64_t delay, njs_vm_event_t vm_event);
-typedef void (*njs_event_destructor)(njs_external_ptr_t external,
+typedef void (*njs_event_destructor_t)(njs_external_ptr_t external,
     njs_host_event_t event);
 
 
 typedef struct {
-    njs_set_timer                   set_timer;
-    njs_event_destructor            clear_timer;
+    njs_set_timer_t                 set_timer;
+    njs_event_destructor_t          clear_timer;
 } njs_vm_ops_t;
 
 
@@ -165,7 +165,7 @@ NXT_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external);
 
 NXT_EXPORT njs_vm_event_t 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_destructor_t 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_post_event(njs_vm_t *vm, njs_vm_event_t vm_event,
     const njs_value_t *args, nxt_uint_t nargs);
index 2b3ee097071153fb51fcc51bdfbd146723e903f0..4605e655551537d3283be138a0ffacbe65c32757 100644 (file)
@@ -111,6 +111,7 @@ const njs_object_init_t    *njs_function_init[] = {
     &njs_decode_uri_component_function_init,
     &njs_require_function_init,
     &njs_set_timeout_function_init,
+    &njs_set_immediate_function_init,
     &njs_clear_timeout_function_init,
     NULL
 };
@@ -132,6 +133,8 @@ const njs_function_init_t  njs_native_functions[] = {
     { njs_module_require,              { NJS_SKIP_ARG, NJS_STRING_ARG } },
     { njs_set_timeout,
       { NJS_SKIP_ARG, NJS_FUNCTION_ARG, NJS_NUMBER_ARG } },
+    { njs_set_immediate,
+      { NJS_SKIP_ARG, NJS_FUNCTION_ARG } },
     { njs_clear_timeout,               { NJS_SKIP_ARG, NJS_NUMBER_ARG } },
 };
 
index e09cdbc0abfa7e043d49e2c8642f7584f325fce3..405c607e16413ea696fb6dbceaa7240c08307da8 100644 (file)
 
 
 typedef struct {
-    njs_function_t        *function;
-    njs_value_t           *args;
-    nxt_uint_t            nargs;
-    njs_host_event_t      host_event;
-    njs_event_destructor  destructor;
+    njs_function_t          *function;
+    njs_value_t             *args;
+    nxt_uint_t              nargs;
+    njs_host_event_t        host_event;
+    njs_event_destructor_t  destructor;
 
-    njs_value_t           id;
-    nxt_queue_link_t      link;
+    njs_value_t             id;
+    nxt_queue_link_t        link;
 
-    unsigned              posted:1;
-    unsigned              once:1;
+    unsigned                posted:1;
+    unsigned                once:1;
 } njs_event_t;
 
 
index 6ca1e1166a474b1de45c959812243d41476da7ab..f73f5da632585e11bde5449d6bbef74e060397e9 100644 (file)
@@ -406,6 +406,7 @@ njs_generator(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
     case NJS_TOKEN_DECODE_URI_COMPONENT:
     case NJS_TOKEN_REQUIRE:
     case NJS_TOKEN_SET_TIMEOUT:
+    case NJS_TOKEN_SET_IMMEDIATE:
     case NJS_TOKEN_CLEAR_TIMEOUT:
         return njs_generate_builtin_object(vm, generator, node);
 
index 039c3a5945e726a67d8d67d8248a84de84bd3f75..ba7dd9b772bd1e2f36c7492195d9e9c6661928e2 100644 (file)
@@ -90,6 +90,7 @@ static const njs_keyword_t  njs_keywords[] = {
     { nxt_string("decodeURIComponent"),  NJS_TOKEN_DECODE_URI_COMPONENT, 0 },
     { nxt_string("require"),      NJS_TOKEN_REQUIRE, 0 },
     { nxt_string("setTimeout"),   NJS_TOKEN_SET_TIMEOUT, 0 },
+    { nxt_string("setImmediate"), NJS_TOKEN_SET_IMMEDIATE, 0 },
     { nxt_string("clearTimeout"), NJS_TOKEN_CLEAR_TIMEOUT, 0 },
 
     /* Reserved words. */
index abf7a518f3510f6e32201002057fb09b7849621d..f09cda0b70758897732680f2fdd2132942b1477b 100644 (file)
@@ -2075,6 +2075,7 @@ njs_parser_terminal(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token)
     case NJS_TOKEN_DECODE_URI_COMPONENT:
     case NJS_TOKEN_REQUIRE:
     case NJS_TOKEN_SET_TIMEOUT:
+    case NJS_TOKEN_SET_IMMEDIATE:
     case NJS_TOKEN_CLEAR_TIMEOUT:
         return njs_parser_builtin_function(vm, parser, node);
 
index ab10c0c07e76ff4aa71b19cab1ff6630e9d83d5d..a992cb77782ff79a99c7c02dd3735587b02c8eea 100644 (file)
@@ -199,6 +199,7 @@ typedef enum {
     NJS_TOKEN_DECODE_URI_COMPONENT,
     NJS_TOKEN_REQUIRE,
     NJS_TOKEN_SET_TIMEOUT,
+    NJS_TOKEN_SET_IMMEDIATE,
     NJS_TOKEN_CLEAR_TIMEOUT,
 
     NJS_TOKEN_RESERVED,
index 08aa587d480c4a8e52f7cf5b8a2aee842ba07483..39caaacbafd0e0dac935b26b1edd04e2e5847568 100644 (file)
 #include <stdio.h>
 
 
-njs_ret_t
-njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
-    njs_index_t unused)
+static njs_ret_t
+njs_set_timer(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused, nxt_bool_t immediate)
 {
+    nxt_uint_t     n;
     uint64_t       delay;
     njs_event_t   *event;
     njs_vm_ops_t  *ops;
@@ -36,7 +37,7 @@ njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
 
     delay = 0;
 
-    if (nargs >= 3 && njs_is_number(&args[2])) {
+    if (!immediate && nargs >= 3 && njs_is_number(&args[2])) {
         delay = args[2].data.u.number;
     }
 
@@ -45,9 +46,11 @@ njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
         goto memory_error;
     }
 
-    event->destructor = ops->clear_timer;
+    n = immediate ? 2 : 3;
+
+    event->destructor = (ops != NULL) ? ops->clear_timer : NULL;
     event->function = args[1].data.u.function;
-    event->nargs = (nargs >= 3) ? nargs - 3 : 0;
+    event->nargs = (nargs >= n) ? nargs - n : 0;
     event->once = 1;
     event->posted = 0;
 
@@ -58,11 +61,11 @@ njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
             goto memory_error;
         }
 
-        memcpy(event->args, &args[3], sizeof(njs_value_t) * event->nargs);
+        memcpy(event->args, &args[n], sizeof(njs_value_t) * event->nargs);
     }
 
     event->host_event = ops->set_timer(vm->external, delay, event);
-    if (event->host_event == NULL) {
+    if (nxt_slow_path(event->host_event == NULL)) {
         njs_internal_error(vm, "set_timer() failed");
         return NJS_ERROR;
     }
@@ -77,6 +80,22 @@ memory_error:
 }
 
 
+njs_ret_t
+njs_set_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused)
+{
+    return njs_set_timer(vm, args, nargs, unused, 0);
+}
+
+
+njs_ret_t
+njs_set_immediate(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
+    njs_index_t unused)
+{
+    return njs_set_timer(vm, args, nargs, unused, 1);
+}
+
+
 njs_ret_t
 njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs,
     njs_index_t unused)
@@ -116,6 +135,12 @@ const njs_object_init_t  njs_set_timeout_function_init = {
     0,
 };
 
+const njs_object_init_t  njs_set_immediate_function_init = {
+    nxt_string("setImmediate"),
+    NULL,
+    0,
+};
+
 
 const njs_object_init_t  njs_clear_timeout_function_init = {
     nxt_string("clearTimeout"),
index 86185be5434d89cb9977e891524890c0feebf7ee..868719e4f32388ae6a73abaa5822ea9d3bdb2075 100644 (file)
 
 njs_ret_t njs_set_timeout(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused);
+njs_ret_t njs_set_immediate(njs_vm_t *vm, njs_value_t *args,
+    nxt_uint_t nargs, njs_index_t unused);
 njs_ret_t njs_clear_timeout(njs_vm_t *vm, njs_value_t *args,
     nxt_uint_t nargs, njs_index_t unused);
 
 
 extern const njs_object_init_t  njs_set_timeout_function_init;
+extern const njs_object_init_t  njs_set_immediate_function_init;
 extern const njs_object_init_t  njs_clear_timeout_function_init;
 
 #endif /* _NJS_TIMEOUT_H_INCLUDED_ */
index fd7cc24069f4db2cdbbfcb97ebe6537ee28f1bd0..7dd4fe0654da0e434481a238c5c482691fd17e88 100644 (file)
@@ -950,6 +950,7 @@ enum njs_function_e {
     NJS_FUNCTION_STRING_DECODE_URI_COMPONENT,
     NJS_FUNCTION_REQUIRE,
     NJS_FUNCTION_SET_TIMEOUT,
+    NJS_FUNCTION_SET_IMMEDIATE,
     NJS_FUNCTION_CLEAR_TIMEOUT,
 #define NJS_FUNCTION_MAX       (NJS_FUNCTION_CLEAR_TIMEOUT + 1)
 };