commit 29cafd35fb2b7cff759fb4c9b84fa4600875321f
Author: lijunlong <lijunlong@openresty.com>
Date:   Sun Apr 11 14:34:47 2021 +0800

    feature: added a process exit callback point.

diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index d7479fa4..c421e43c 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -255,6 +255,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
     }
 
 
+    ngx_proc_exit_top_handler = ngx_proc_exit_def_handler;
     conf.ctx = cycle->conf_ctx;
     conf.cycle = cycle;
     conf.pool = pool;
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c
index 15680237..9d2e81c5 100644
--- a/src/os/unix/ngx_process.c
+++ b/src/os/unix/ngx_process.c
@@ -34,6 +34,7 @@ ngx_int_t        ngx_process_slot;
 ngx_socket_t     ngx_channel;
 ngx_int_t        ngx_last_process;
 ngx_process_t    ngx_processes[NGX_MAX_PROCESSES];
+ngx_proc_exit_pt ngx_proc_exit_top_handler;
 
 
 ngx_signal_t  signals[] = {
@@ -83,6 +84,13 @@ ngx_signal_t  signals[] = {
 };
 
 
+void
+ngx_proc_exit_def_handler(ngx_pid_t pid)
+{
+    /* do nothing */
+}
+
+
 ngx_pid_t
 ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
     char *name, ngx_int_t respawn)
@@ -557,6 +565,7 @@ ngx_process_get_status(void)
         }
 
         ngx_unlock_mutexes(pid);
+        ngx_proc_exit_top_handler(pid);
     }
 }
 
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h
index 3986639b..c5972541 100644
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -18,6 +18,8 @@ typedef pid_t       ngx_pid_t;
 #define NGX_INVALID_PID  -1
 
 typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data);
+#define NGX_HAVE_PROC_EXIT 1
+typedef void (*ngx_proc_exit_pt)(ngx_pid_t pid);
 
 typedef struct {
     ngx_pid_t           pid;
@@ -66,6 +67,7 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle,
 ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx);
 ngx_int_t ngx_init_signals(ngx_log_t *log);
 void ngx_debug_point(void);
+void ngx_proc_exit_def_handler(ngx_pid_t pid);
 
 
 #if (NGX_HAVE_SCHED_YIELD)
@@ -85,6 +87,7 @@ extern ngx_socket_t   ngx_channel;
 extern ngx_int_t      ngx_process_slot;
 extern ngx_int_t      ngx_last_process;
 extern ngx_process_t  ngx_processes[NGX_MAX_PROCESSES];
+extern ngx_proc_exit_pt  ngx_proc_exit_top_handler;
 
 
 #endif /* _NGX_PROCESS_H_INCLUDED_ */