Skip to content

Commit fc02e4d

Browse files
Added execute_pending_jobs after exit hook.
1 parent aa09e29 commit fc02e4d

5 files changed

Lines changed: 51 additions & 6 deletions

File tree

external/njs_shell.c

Lines changed: 20 additions & 0 deletions
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+
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,6 +2708,8 @@ 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;
@@ -2705,6 +2718,13 @@ njs_engine_qjs_destroy(njs_engine_t *engine)
27052718

27062719
qjs_call_exit_hook(engine->u.qjs.ctx);
27072720

2721+
for ( ;; ) {
2722+
ret = JS_ExecutePendingJob(JS_GetRuntime(engine->u.qjs.ctx), &cx);
2723+
if (ret == 0) {
2724+
break;
2725+
}
2726+
}
2727+
27082728
console = JS_GetRuntimeOpaque(engine->u.qjs.rt);
27092729

27102730
if (console->rejected_promises != NULL) {

nginx/ngx_js.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,10 +830,18 @@ static void
830830
ngx_engine_njs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
831831
ngx_js_loc_conf_t *conf)
832832
{
833+
njs_int_t ret;
833834
ngx_js_event_t *event;
834835
njs_rbtree_node_t *node;
835836

836837
if (ctx != NULL) {
838+
ret = njs_vm_call_exit_hook(e->u.njs.vm);
839+
if (ret != NJS_OK) {
840+
ngx_js_log_exception(e->u.njs.vm, ctx->log, "exit hook exception");
841+
}
842+
843+
(void) ngx_njs_execute_pending_jobs(e->u.njs.vm, ctx->log);
844+
837845
node = njs_rbtree_min(&ctx->waiting_events);
838846

839847
while (njs_rbtree_is_there_successor(&ctx->waiting_events, node)) {
@@ -1208,6 +1216,9 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
12081216
ngx_qjs_log_exception(e, ctx->log, "exit hook exception");
12091217
}
12101218

1219+
(void) ngx_qjs_execute_pending_jobs(cx, ctx->log);
1220+
1221+
12111222
node = njs_rbtree_min(&ctx->waiting_events);
12121223

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

nginx/t/js_exit.t

Lines changed: 9 additions & 2 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,12 @@ like(http(
9396

9497
$t->stop();
9598

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

src/njs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,8 @@ typedef njs_int_t (*njs_iterator_handler_t)(njs_vm_t *vm,
308308

309309
NJS_EXPORT void njs_vm_opt_init(njs_vm_opt_t *options);
310310
NJS_EXPORT njs_vm_t *njs_vm_create(njs_vm_opt_t *options);
311-
NJS_EXPORT void njs_vm_destroy(njs_vm_t *vm);;
311+
NJS_EXPORT void njs_vm_destroy(njs_vm_t *vm);
312+
NJS_EXPORT njs_int_t njs_vm_call_exit_hook(njs_vm_t *vm);
312313

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

src/njs_vm.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,13 +191,19 @@ 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
}
200+
return NJS_OK;
201+
}
200202

203+
204+
void
205+
njs_vm_destroy(njs_vm_t *vm)
206+
{
201207
njs_mp_destroy(vm->mem_pool);
202208
}
203209

0 commit comments

Comments
 (0)