diff options
| author | Dmitry Kozlov <xeb@mail.ru> | 2016-03-18 13:40:07 +0300 |
|---|---|---|
| committer | Dmitry Kozlov <xeb@mail.ru> | 2016-03-18 13:40:07 +0300 |
| commit | ecee62f204a93c7f512dce46657fbd101d155d78 (patch) | |
| tree | d2fbe940bd94e7a93310651dceaf7c27e4866b75 /accel-pppd/session.c | |
| parent | 862f1cbfe781098be2263443fc108a46f521a163 (diff) | |
| download | accel-ppp-ecee62f204a93c7f512dce46657fbd101d155d78.tar.gz accel-ppp-ecee62f204a93c7f512dce46657fbd101d155d78.zip | |
make termination caused by SIGTERM soft
Diffstat (limited to 'accel-pppd/session.c')
| -rw-r--r-- | accel-pppd/session.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/accel-pppd/session.c b/accel-pppd/session.c index 1ed1023..1fbac10 100644 --- a/accel-pppd/session.c +++ b/accel-pppd/session.c @@ -292,17 +292,35 @@ void __export ap_session_terminate(struct ap_session *ses, int cause, int hard) } } -void ap_shutdown_soft(void (*cb)(void)) +static void __terminate_soft_reboot(struct ap_session *ses) { + ap_session_terminate(ses, TERM_NAS_REBOOT, 0); +} + +int ap_shutdown_soft(void (*cb)(void), int term) +{ + struct ap_session *ses; + ap_shutdown = 1; shutdown_cb = cb; + pthread_rwlock_rdlock(&ses_lock); + if (!ap_session_stat.starting && !ap_session_stat.active && !ap_session_stat.finishing) { + pthread_rwlock_unlock(&ses_lock); if (shutdown_cb) shutdown_cb(); else kill(getpid(), SIGTERM); + return 1; + } else if (term) { + list_for_each_entry(ses, &ses_list, entry) + triton_context_call(ses->ctrl->ctx, (triton_event_func)__terminate_soft_reboot, ses); } + + pthread_rwlock_unlock(&ses_lock); + + return 0; } static void generate_sessionid(struct ap_session *ses) |
