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;
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;
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);
&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
};
{ 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 } },
};
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;
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);
{ 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. */
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);
NJS_TOKEN_DECODE_URI_COMPONENT,
NJS_TOKEN_REQUIRE,
NJS_TOKEN_SET_TIMEOUT,
+ NJS_TOKEN_SET_IMMEDIATE,
NJS_TOKEN_CLEAR_TIMEOUT,
NJS_TOKEN_RESERVED,
#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;
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;
}
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;
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;
}
}
+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)
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"),
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_ */
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)
};