Skip to content

Commit 69514db

Browse files
Added promises execution after njs.on('exit', ..) hook.
1 parent 9a5430e commit 69514db

File tree

5 files changed

+50
-7
lines changed

5 files changed

+50
-7
lines changed

external/njs_shell.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,17 @@ njs_engine_njs_init(njs_engine_t *engine, njs_opts_t *opts)
13661366
static njs_int_t
13671367
njs_engine_njs_destroy(njs_engine_t *engine)
13681368
{
1369+
njs_int_t ret;
1370+
1371+
(void) njs_vm_call_exit_hook(engine->u.njs.vm);
1372+
1373+
for ( ;; ) {
1374+
ret = njs_vm_execute_pending_job(engine->u.njs.vm);
1375+
if (ret == NJS_OK) {
1376+
break;
1377+
}
1378+
}
1379+
13691380
njs_vm_destroy(engine->u.njs.vm);
13701381
njs_mp_destroy(engine->pool);
13711382

@@ -2697,13 +2708,22 @@ njs_engine_qjs_destroy(njs_engine_t *engine)
26972708
{
26982709
uint32_t i;
26992710
njs_ev_t *ev;
2711+
njs_int_t ret;
2712+
JSContext *cx;
27002713
njs_queue_t *events;
27012714
njs_console_t *console;
27022715
njs_262agent_t *agent;
27032716
njs_queue_link_t *link;
27042717
njs_rejected_promise_t *rejected_promise;
27052718

2706-
qjs_call_exit_hook(engine->u.qjs.ctx);
2719+
(void) qjs_call_exit_hook(engine->u.qjs.ctx);
2720+
2721+
for ( ;; ) {
2722+
ret = JS_ExecutePendingJob(JS_GetRuntime(engine->u.qjs.ctx), &cx);
2723+
if (ret == 0) {
2724+
break;
2725+
}
2726+
}
27072727

27082728
console = JS_GetRuntimeOpaque(engine->u.qjs.rt);
27092729

nginx/ngx_js.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,10 +827,18 @@ static void
827827
ngx_engine_njs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
828828
ngx_js_loc_conf_t *conf)
829829
{
830+
njs_int_t ret;
830831
ngx_js_event_t *event;
831832
njs_rbtree_node_t *node;
832833

833834
if (ctx != NULL) {
835+
ret = njs_vm_call_exit_hook(e->u.njs.vm);
836+
if (ret != NJS_OK) {
837+
ngx_js_log_exception(e->u.njs.vm, ctx->log, "exit hook exception");
838+
}
839+
840+
(void) ngx_njs_execute_pending_jobs(e->u.njs.vm, ctx->log);
841+
834842
node = njs_rbtree_min(&ctx->waiting_events);
835843

836844
while (njs_rbtree_is_there_successor(&ctx->waiting_events, node)) {
@@ -1198,6 +1206,8 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
11981206
ngx_qjs_log_exception(e, ctx->log, "exit hook exception");
11991207
}
12001208

1209+
(void) ngx_qjs_execute_pending_jobs(cx, ctx->log);
1210+
12011211
node = njs_rbtree_min(&ctx->waiting_events);
12021212

12031213
while (njs_rbtree_is_there_successor(&ctx->waiting_events, node)) {

nginx/t/js_exit.t

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ $t->write_file('test.js', <<EOF);
6060
function test(r) {
6161
njs.on('exit', function() {
6262
ngx.log(ngx.WARN, `exit hook: bs: \${r.variables.bytes_sent}`);
63+
64+
new Promise((resolve) => {resolve()})
65+
.then(v => ngx.log(ngx.WARN, "exit hook promise"));
6366
});
6467
6568
r.return(200, `bs: \${r.variables.bytes_sent}`);
@@ -81,7 +84,7 @@ $t->write_file('test.js', <<EOF);
8184
8285
EOF
8386

84-
$t->try_run('no njs')->plan(3);
87+
$t->try_run('no njs')->plan(4);
8588

8689
###############################################################################
8790

@@ -93,8 +96,10 @@ like(http(
9396

9497
$t->stop();
9598

96-
like($t->read_file('error.log'), qr/\[warn\].*exit hook: bs: \d+/,
97-
'exit hook logged');
99+
my $error_log = $t->read_file('error.log');
100+
101+
like($error_log, qr/\[warn\].*exit hook: bs: \d+/, 'exit hook logged');
102+
like($error_log, qr/\[warn\].*exit hook promise/, 'exit hook promise logged');
98103
like($t->read_file('access.log'), qr/\[var:\d+ header:626172 url:\/test\]/,
99104
'access log has bytes_sent');
100105

src/njs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ typedef njs_int_t (*njs_iterator_handler_t)(njs_vm_t *vm,
310310
NJS_EXPORT void njs_vm_opt_init(njs_vm_opt_t *options);
311311
NJS_EXPORT njs_vm_t *njs_vm_create(njs_vm_opt_t *options);
312312
NJS_EXPORT void njs_vm_destroy(njs_vm_t *vm);
313+
NJS_EXPORT njs_int_t njs_vm_call_exit_hook(njs_vm_t *vm);
313314

314315
NJS_EXPORT njs_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end);
315316
NJS_EXPORT void njs_vm_set_module_loader(njs_vm_t *vm,

src/njs_vm.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,13 +191,20 @@ njs_vm_ctor_push(njs_vm_t *vm)
191191
}
192192

193193

194-
void
195-
njs_vm_destroy(njs_vm_t *vm)
194+
njs_int_t
195+
njs_vm_call_exit_hook(njs_vm_t *vm)
196196
{
197197
if (vm->hooks[NJS_HOOK_EXIT] != NULL) {
198-
(void) njs_vm_call(vm, vm->hooks[NJS_HOOK_EXIT], NULL, 0);
198+
return njs_vm_call(vm, vm->hooks[NJS_HOOK_EXIT], NULL, 0);
199199
}
200200

201+
return NJS_OK;
202+
}
203+
204+
205+
void
206+
njs_vm_destroy(njs_vm_t *vm)
207+
{
201208
njs_mp_destroy(vm->mem_pool);
202209
}
203210

0 commit comments

Comments
 (0)