aboutsummaryrefslogtreecommitdiff
path: root/nginx/ngx_stream_js_module.c
diff options
context:
space:
mode:
authorDmitry Volyntsev <xeioex@nginx.com>2023-11-21 09:00:52 -0800
committerDmitry Volyntsev <xeioex@nginx.com>2023-11-21 09:00:52 -0800
commit9de301351c28f1506f9fc4e20cfd40e121fb7b2e (patch)
treeffa2af428bd388e20d0f99b33997eac153e7614f /nginx/ngx_stream_js_module.c
parent735ec1d89d25d014870452ba1600a8cd9dec5641 (diff)
downloadnjs-9de301351c28f1506f9fc4e20cfd40e121fb7b2e.tar.gz
njs-9de301351c28f1506f9fc4e20cfd40e121fb7b2e.zip
Moving out setTimeout() and clearTimeout() from njs core.
This functions are not part of the ECMAScript and should be implemented by host environment.
Diffstat (limited to 'nginx/ngx_stream_js_module.c')
-rw-r--r--nginx/ngx_stream_js_module.c116
1 files changed, 34 insertions, 82 deletions
diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c
index e13f6f7f..bb19f811 100644
--- a/nginx/ngx_stream_js_module.c
+++ b/nginx/ngx_stream_js_module.c
@@ -48,7 +48,7 @@ typedef struct {
typedef struct {
- njs_vm_t *vm;
+ NGX_JS_COMMON_CTX;
njs_opaque_value_t retval;
njs_opaque_value_t args[3];
ngx_buf_t *buf;
@@ -67,14 +67,6 @@ typedef struct {
} ngx_stream_js_ctx_t;
-typedef struct {
- ngx_stream_session_t *session;
- njs_vm_event_t vm_event;
- void *unused;
- ngx_int_t ident;
-} ngx_stream_js_event_t;
-
-
static ngx_int_t ngx_stream_js_access_handler(ngx_stream_session_t *s);
static ngx_int_t ngx_stream_js_preread_handler(ngx_stream_session_t *s);
static ngx_int_t ngx_stream_js_phase_handler(ngx_stream_session_t *s,
@@ -121,11 +113,6 @@ static njs_int_t ngx_stream_js_periodic_variables(njs_vm_t *vm,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_value_t *retval);
-static njs_host_event_t ngx_stream_js_set_timer(njs_external_ptr_t external,
- uint64_t delay, njs_vm_event_t vm_event);
-static void ngx_stream_js_clear_timer(njs_external_ptr_t external,
- njs_host_event_t event);
-static void ngx_stream_js_timer_handler(ngx_event_t *ev);
static ngx_pool_t *ngx_stream_js_pool(njs_vm_t *vm, ngx_stream_session_t *s);
static ngx_resolver_t *ngx_stream_js_resolver(njs_vm_t *vm,
ngx_stream_session_t *s);
@@ -138,6 +125,8 @@ static size_t ngx_stream_js_max_response_buffer_size(njs_vm_t *vm,
ngx_stream_session_t *s);
static void ngx_stream_js_handle_event(ngx_stream_session_t *s,
njs_vm_event_t vm_event, njs_value_t *args, njs_uint_t nargs);
+static void ngx_stream_js_event_finalize(ngx_stream_session_t *s, njs_int_t rc);
+static ngx_js_ctx_t *ngx_stream_js_ctx(njs_vm_t *vm, ngx_stream_session_t *s);
static void ngx_stream_js_periodic_handler(ngx_event_t *ev);
static void ngx_stream_js_periodic_event_handler(ngx_event_t *ev);
@@ -616,8 +605,6 @@ static njs_external_t ngx_stream_js_ext_session_flags[] = {
static njs_vm_ops_t ngx_stream_js_ops = {
- ngx_stream_js_set_timer,
- ngx_stream_js_clear_timer,
NULL,
ngx_js_logger,
};
@@ -635,6 +622,8 @@ static uintptr_t ngx_stream_js_uptr[] = {
(uintptr_t) ngx_stream_js_buffer_size,
(uintptr_t) ngx_stream_js_max_response_buffer_size,
(uintptr_t) 0 /* main_conf ptr */,
+ (uintptr_t) ngx_stream_js_event_finalize,
+ (uintptr_t) ngx_stream_js_ctx,
};
@@ -762,7 +751,7 @@ ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name)
return NGX_ERROR;
}
- if (njs_vm_pending(ctx->vm)) {
+ if (ngx_vm_pending(ctx)) {
ctx->in_progress = 1;
rc = ctx->events[NGX_JS_EVENT_UPLOAD].ev ? NGX_AGAIN : NGX_DONE;
@@ -933,7 +922,7 @@ ngx_stream_js_variable_set(ngx_stream_session_t *s,
ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
- pending = njs_vm_pending(ctx->vm);
+ pending = ngx_vm_pending(ctx);
rc = ngx_js_invoke(ctx->vm, fname, s->connection->log, &ctx->args[0], 1,
&ctx->retval);
@@ -1016,6 +1005,8 @@ ngx_stream_js_init_vm(ngx_stream_session_t *s, njs_int_t proto_id)
return NGX_ERROR;
}
+ ngx_js_ctx_init((ngx_js_ctx_t *) ctx);
+
njs_value_invalid_set(njs_value_arg(&ctx->retval));
ngx_stream_set_ctx(s, ctx, ngx_stream_js_module);
@@ -1106,14 +1097,14 @@ ngx_stream_js_cleanup(void *data)
ngx_stream_js_drop_events(ctx);
- if (njs_vm_pending(ctx->vm)) {
+ if (ngx_vm_pending(ctx)) {
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, "pending events");
}
ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
"stream js vm destroy: %p", ctx->vm);
- njs_vm_destroy(ctx->vm);
+ ngx_js_ctx_destroy((ngx_js_ctx_t *) ctx);
}
@@ -1672,65 +1663,6 @@ ngx_stream_js_periodic_variables(njs_vm_t *vm, njs_object_prop_t *prop,
}
-static njs_host_event_t
-ngx_stream_js_set_timer(njs_external_ptr_t external, uint64_t delay,
- njs_vm_event_t vm_event)
-{
- ngx_event_t *ev;
- ngx_stream_session_t *s;
- ngx_stream_js_event_t *js_event;
-
- s = (ngx_stream_session_t *) external;
-
- ev = ngx_pcalloc(s->connection->pool, sizeof(ngx_event_t));
- if (ev == NULL) {
- return NULL;
- }
-
- js_event = ngx_palloc(s->connection->pool, sizeof(ngx_stream_js_event_t));
- if (js_event == NULL) {
- return NULL;
- }
-
- js_event->session = s;
- js_event->vm_event = vm_event;
- js_event->ident = s->connection->fd;
-
- ev->data = js_event;
- ev->log = s->connection->log;
- ev->handler = ngx_stream_js_timer_handler;
-
- ngx_add_timer(ev, delay);
-
- return ev;
-}
-
-
-static void
-ngx_stream_js_clear_timer(njs_external_ptr_t external, njs_host_event_t event)
-{
- ngx_event_t *ev = event;
-
- if (ev->timer_set) {
- ngx_del_timer(ev);
- }
-}
-
-
-static void
-ngx_stream_js_timer_handler(ngx_event_t *ev)
-{
- ngx_stream_session_t *s;
- ngx_stream_js_event_t *js_event;
-
- js_event = (ngx_stream_js_event_t *) ev->data;
-
- s = js_event->session;
-
- ngx_stream_js_handle_event(s, js_event->vm_event, NULL, 0);
-}
-
-
static ngx_pool_t *
ngx_stream_js_pool(njs_vm_t *vm, ngx_stream_session_t *s)
{
@@ -1816,13 +1748,26 @@ ngx_stream_js_handle_event(ngx_stream_session_t *s, njs_vm_event_t vm_event,
ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
"js exception: %V", &exception);
+ }
+
+ ngx_stream_js_event_finalize(s, rc);
+}
+
+
+static void
+ngx_stream_js_event_finalize(ngx_stream_session_t *s, njs_int_t rc)
+{
+ ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
+ "http js event finalize rc: %i", (ngx_int_t) rc);
+ if (rc == NJS_ERROR) {
if (s->health_check) {
ngx_stream_js_periodic_finalize(s, NGX_ERROR);
return;
}
ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);
+ return;
}
if (rc == NJS_OK) {
@@ -1831,6 +1776,13 @@ ngx_stream_js_handle_event(ngx_stream_session_t *s, njs_vm_event_t vm_event,
}
+static ngx_js_ctx_t *
+ngx_stream_js_ctx(njs_vm_t *vm, ngx_stream_session_t *s)
+{
+ return ngx_stream_get_module_ctx(s, ngx_stream_js_module);
+}
+
+
static njs_int_t
ngx_js_stream_init(njs_vm_t *vm)
{
@@ -2022,7 +1974,7 @@ ngx_stream_js_periodic_event_handler(ngx_event_t *ev)
ctx = ngx_stream_get_module_ctx(s, ngx_stream_js_module);
- if (!njs_vm_pending(ctx->vm)) {
+ if (!ngx_vm_pending(ctx)) {
ngx_stream_js_periodic_finalize(s, NGX_OK);
return;
}
@@ -2039,9 +1991,9 @@ ngx_stream_js_periodic_finalize(ngx_stream_session_t *s, ngx_int_t rc)
ngx_log_debug4(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
"stream js periodic finalize: \"%V\" rc: %i c: %i "
"pending: %i", &ctx->periodic->method, rc, s->received,
- njs_vm_pending(ctx->vm));
+ ngx_vm_pending(ctx));
- if (s->received > 1 || (rc == NGX_OK && njs_vm_pending(ctx->vm))) {
+ if (s->received > 1 || (rc == NGX_OK && ngx_vm_pending(ctx))) {
return;
}