96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley/*
8664a1bd40814ed0b42eacfc5eb354b598dfd6dfTinderbox User * Copyright (C) 1999-2005, 2007-2009, 2013-2017 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <config.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
26cf4737b3e84c3a686a5eacebf22ac39e57d4caMark Andrews#include <sys/param.h> /* Openserver 5.0.6A and FD_SETSIZE */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <sys/types.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <stddef.h>
5c7d67e3e68f8dbc45ffd4e1ea94696899b7b966Bob Halley#include <stdlib.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <errno.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <unistd.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <signal.h>
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#include <sys/time.h>
386d3a99c190bad55edf44d076e6bd087e230ab8Tatuya JINMEI 神明達哉#ifdef HAVE_EPOLL
386d3a99c190bad55edf44d076e6bd087e230ab8Tatuya JINMEI 神明達哉#include <sys/epoll.h>
386d3a99c190bad55edf44d076e6bd087e230ab8Tatuya JINMEI 神明達哉#endif
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <isc/app.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#include <isc/boolean.h>
801dceea23d11975f5a5ae6ccbdf1dbde6b7af13David Lawrence#include <isc/condition.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/mem.h>
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence#include <isc/msgs.h>
801dceea23d11975f5a5ae6ccbdf1dbde6b7af13David Lawrence#include <isc/mutex.h>
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley#include <isc/event.h>
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#include <isc/platform.h>
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews#include <isc/strerror.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/string.h>
eefea43215016bce437ab4a7441b2851fd182960David Lawrence#include <isc/task.h>
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#include <isc/time.h>
440be4c866f6935ac069db79a414304507a664c2Michael Graff#include <isc/util.h>
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#include <pthread.h>
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*%
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * For BIND9 internal applications built with threads, we use a single app
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * context and let multiple worker, I/O, timer threads do actual jobs.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * For other cases (including BIND9 built without threads) an app context acts
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * as an event loop dispatching various events.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifndef ISC_PLATFORM_USETHREADS
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#include "../timer_p.h"
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#include "../task_p.h"
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#include "socket_p.h"
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington#ifdef ISC_PLATFORM_USETHREADS
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellingtonstatic pthread_t blockedthread;
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*%
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * The following are intended for internal use (indicated by "isc__"
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * prefix) but are not declared as static, allowing direct access from
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * unit tests etc.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_start(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_ctxstart(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_onrun(isc_mem_t *mctx, isc_task_t *task,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_taskaction_t action, void *arg);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_ctxrun(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_run(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_shutdown(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_reload(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__app_ctxfinish(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__app_finish(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__app_block(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__app_unblock(void);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__appctx_destroy(isc_appctx_t **ctxp);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__appctx_settaskmgr(isc_appctx_t *ctx, isc_taskmgr_t *taskmgr);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__appctx_setsocketmgr(isc_appctx_t *ctx, isc_socketmgr_t *socketmgr);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid isc__appctx_settimermgr(isc_appctx_t *ctx, isc_timermgr_t *timermgr);
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrewsisc_result_t isc__app_ctxonrun(isc_appctx_t *ctx, isc_mem_t *mctx,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews isc_task_t *task, isc_taskaction_t action,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews void *arg);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉/*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The application context of this module. This implementation actually
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * doesn't use it. (This may change in the future).
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#define APPCTX_MAGIC ISC_MAGIC('A', 'p', 'c', 'x')
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#define VALID_APPCTX(c) ISC_MAGIC_VALID(c, APPCTX_MAGIC)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉typedef struct isc__appctx {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_appctx_t common;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_mem_t *mctx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_mutex_t lock;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_eventlist_t on_run;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t shutdown_requested;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t running;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*!
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * We assume that 'want_shutdown' can be read and written atomically.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t want_shutdown;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * We assume that 'want_reload' can be read and written atomically.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t want_reload;
d7201de09b85929a86b157f4b2d91667c68c6b52Automatic Updater
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t blocked;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_taskmgr_t *taskmgr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_socketmgr_t *socketmgr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_timermgr_t *timermgr;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_mutex_t readylock;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_condition_t ready;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉} isc__appctx_t;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static isc__appctx_t isc_g_appctx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static struct {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_appmethods_t methods;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*%
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The following are defined just for avoiding unused static functions.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews void *run, *shutdown, *start, *reload, *finish, *block, *unblock;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉} appmethods = {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_destroy,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxstart,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxrun,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxsuspend,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxshutdown,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxfinish,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_settaskmgr,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_setsocketmgr,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews isc__appctx_settimermgr,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews isc__app_ctxonrun
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt },
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void *)isc__app_run,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void *)isc__app_shutdown,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void *)isc__app_start,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void *)isc__app_reload,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void *)isc__app_finish,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void *)isc__app_block,
8fec8134ea13c2c082c3e63f1ce0afd851e45a91Tatuya JINMEI 神明達哉 (void *)isc__app_unblock
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉};
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#ifdef HAVE_LINUXTHREADS
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley * Linux has sigwait(), but it appears to prevent signal handlers from
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley * running, even if they're not in the set being waited for. This makes
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley * it impossible to get the default actions for SIGILL, SIGSEGV, etc.
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley * Instead of messing with it, we just use sigsuspend() instead.
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley */
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley#undef HAVE_SIGWAIT
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley * We need to remember which thread is the main thread...
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley */
a829555ed724caa56b1ff7716d7eda2266491eafBob Halleystatic pthread_t main_thread;
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#endif
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#ifndef HAVE_SIGWAIT
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halleystatic void
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halleyexit_action(int arg) {
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater UNUSED(arg);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.want_shutdown = ISC_TRUE;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley}
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halleystatic void
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halleyreload_action(int arg) {
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater UNUSED(arg);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.want_reload = ISC_TRUE;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley}
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#endif
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halleystatic isc_result_t
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halleyhandle_signal(int sig, void (*handler)(int)) {
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley struct sigaction sa;
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews char strbuf[ISC_STRERRORSIZE];
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson memset(&sa, 0, sizeof(sa));
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley sa.sa_handler = handler;
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley if (sigfillset(&sa.sa_mask) != 0 ||
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley sigaction(sig, &sa, NULL) < 0) {
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(errno, strbuf, sizeof(strbuf));
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley UNEXPECTED_ERROR(__FILE__, __LINE__,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence isc_msgcat_get(isc_msgcat, ISC_MSGSET_APP,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence ISC_MSG_SIGNALSETUP,
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "handle_signal() %d setup: %s"),
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews sig, strbuf);
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley return (ISC_R_UNEXPECTED);
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley return (ISC_R_SUCCESS);
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley}
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_ctxstart(isc_appctx_t *ctx0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley isc_result_t result;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt int presult;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt sigset_t sset;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt char strbuf[ISC_STRERRORSIZE];
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley /*
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * Start an ISC library application.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#ifdef NEED_PTHREAD_INIT
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley /*
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * BSDI 3.1 seg faults in pthread_sigmask() if we don't do this.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley presult = pthread_init();
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley if (presult != 0) {
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(presult, strbuf, sizeof(strbuf));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley UNEXPECTED_ERROR(__FILE__, __LINE__,
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews "isc_app_start() pthread_init: %s", strbuf);
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley return (ISC_R_UNEXPECTED);
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley }
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#endif
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#ifdef HAVE_LINUXTHREADS
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley main_thread = pthread_self();
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_LINUXTHREADS */
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = isc_mutex_init(&ctx->readylock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (result);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = isc_condition_init(&ctx->ready);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup_rlock;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = isc_mutex_init(&ctx->lock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup_rcond;
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = isc_mutex_init(&ctx->lock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ISC_LIST_INIT(ctx->on_run);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->shutdown_requested = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->running = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->want_shutdown = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->want_reload = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->blocked = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#ifndef HAVE_SIGWAIT
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley /*
0e58c0998df1ccd1a289b2c3f078e7d03d9331d3Bob Halley * Install do-nothing handlers for SIGINT and SIGTERM.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley *
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * We install them now because BSDI 3.1 won't block
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * the default actions, regardless of what we do with
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * pthread_sigmask().
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley */
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley result = handle_signal(SIGINT, exit_action);
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley result = handle_signal(SIGTERM, exit_action);
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#endif
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley /*
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley * Always ignore SIGPIPE.
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley */
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley result = handle_signal(SIGPIPE, SIG_IGN);
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley
d8afbf2f30213b2638a4d77207913db576089c02Michael Sawyer /*
33e482fa3e8befab0d9aaf32ed47b4695e0e6ba3Andreas Gustafsson * On Solaris 2, delivery of a signal whose action is SIG_IGN
33e482fa3e8befab0d9aaf32ed47b4695e0e6ba3Andreas Gustafsson * will not cause sigwait() to return. We may have inherited
838f13fbdc513895d1826201a11531dbde9de04aBrian Wellington * unexpected actions for SIGHUP, SIGINT, and SIGTERM from our parent
dde4382b7fd55c945ef7f4ae5792099ae3a09883Brian Wellington * process (e.g, Solaris cron). Set an action of SIG_DFL to make
a6f31a3fd079f37ad0a7c75ef2d50842cd01811cBrian Wellington * sure sigwait() works as expected. Only do this for SIGTERM and
a6f31a3fd079f37ad0a7c75ef2d50842cd01811cBrian Wellington * SIGINT if we don't have sigwait(), since a different handler is
a6f31a3fd079f37ad0a7c75ef2d50842cd01811cBrian Wellington * installed above.
d8afbf2f30213b2638a4d77207913db576089c02Michael Sawyer */
d8afbf2f30213b2638a4d77207913db576089c02Michael Sawyer result = handle_signal(SIGHUP, SIG_DFL);
838f13fbdc513895d1826201a11531dbde9de04aBrian Wellington if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
a6f31a3fd079f37ad0a7c75ef2d50842cd01811cBrian Wellington
aa3f41bafce993fbd2109ea3803cbce909db1c95Brian Wellington#ifdef HAVE_SIGWAIT
838f13fbdc513895d1826201a11531dbde9de04aBrian Wellington result = handle_signal(SIGTERM, SIG_DFL);
838f13fbdc513895d1826201a11531dbde9de04aBrian Wellington if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
838f13fbdc513895d1826201a11531dbde9de04aBrian Wellington result = handle_signal(SIGINT, SIG_DFL);
d8afbf2f30213b2638a4d77207913db576089c02Michael Sawyer if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
a6f31a3fd079f37ad0a7c75ef2d50842cd01811cBrian Wellington#endif
d8afbf2f30213b2638a4d77207913db576089c02Michael Sawyer
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington#ifdef ISC_PLATFORM_USETHREADS
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley /*
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley * Block SIGHUP, SIGINT, SIGTERM.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley *
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * If isc_app_start() is called from the main thread before any other
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * threads have been created, then the pthread_sigmask() call below
0e58c0998df1ccd1a289b2c3f078e7d03d9331d3Bob Halley * will result in all threads having SIGHUP, SIGINT and SIGTERM
0e58c0998df1ccd1a289b2c3f078e7d03d9331d3Bob Halley * blocked by default, ensuring that only the thread that calls
0e58c0998df1ccd1a289b2c3f078e7d03d9331d3Bob Halley * sigwait() for them will get those signals.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley if (sigemptyset(&sset) != 0 ||
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley sigaddset(&sset, SIGHUP) != 0 ||
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley sigaddset(&sset, SIGINT) != 0 ||
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley sigaddset(&sset, SIGTERM) != 0) {
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(errno, strbuf, sizeof(strbuf));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley UNEXPECTED_ERROR(__FILE__, __LINE__,
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews "isc_app_start() sigsetops: %s", strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = ISC_R_UNEXPECTED;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley }
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley presult = pthread_sigmask(SIG_BLOCK, &sset, NULL);
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley if (presult != 0) {
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(presult, strbuf, sizeof(strbuf));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley UNEXPECTED_ERROR(__FILE__, __LINE__,
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence "isc_app_start() pthread_sigmask: %s",
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = ISC_R_UNEXPECTED;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley }
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington#else /* ISC_PLATFORM_USETHREADS */
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington /*
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington * Unblock SIGHUP, SIGINT, SIGTERM.
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington *
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington * If we're not using threads, we need to make sure that SIGHUP,
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington * SIGINT and SIGTERM are not inherited as blocked from the parent
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington * process.
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington */
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington if (sigemptyset(&sset) != 0 ||
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington sigaddset(&sset, SIGHUP) != 0 ||
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington sigaddset(&sset, SIGINT) != 0 ||
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington sigaddset(&sset, SIGTERM) != 0) {
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(errno, strbuf, sizeof(strbuf));
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington UNEXPECTED_ERROR(__FILE__, __LINE__,
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews "isc_app_start() sigsetops: %s", strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = ISC_R_UNEXPECTED;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington }
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington presult = sigprocmask(SIG_UNBLOCK, &sset, NULL);
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington if (presult != 0) {
1fa64087e7afb06d6b0c0994ace49d1906e820f9Mark Andrews isc__strerror(errno, strbuf, sizeof(strbuf));
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington UNEXPECTED_ERROR(__FILE__, __LINE__,
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews "isc_app_start() sigprocmask: %s", strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = ISC_R_UNEXPECTED;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt goto cleanup;
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington }
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley return (ISC_R_SUCCESS);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt cleanup:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt cleanup_rcond:
e47208b6fb724cba7053baee4246b308e35403a2Evan Hunt (void)isc_condition_destroy(&ctx->ready);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt cleanup_rlock:
e47208b6fb724cba7053baee4246b308e35403a2Evan Hunt (void)isc_mutex_destroy(&ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (result);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt}
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc__app_start(void) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_g_appctx.common.impmagic = APPCTX_MAGIC;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_g_appctx.common.magic = ISCAPI_APPCTX_MAGIC;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_g_appctx.common.methods = &appmethods.methods;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_g_appctx.mctx = NULL;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* The remaining members will be initialized in ctxstart() */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (isc__app_ctxstart((isc_appctx_t *)&isc_g_appctx));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley}
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley void *arg)
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley{
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews return (isc__app_ctxonrun((isc_appctx_t *)&isc_g_appctx, mctx,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews task, action, arg));
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews}
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrewsisc_result_t
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrewsisc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews isc_taskaction_t action, void *arg)
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews{
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley isc_event_t *event;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley isc_task_t *cloned_task = NULL;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley isc_result_t result;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews LOCK(&ctx->lock);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews if (ctx->running) {
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley result = ISC_R_ALREADYRUNNING;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley goto unlock;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley }
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley /*
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley * Note that we store the task to which we're going to send the event
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley * in the event's "sender" field.
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley */
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley isc_task_attach(task, &cloned_task);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley event = isc_event_allocate(mctx, cloned_task, ISC_APPEVENT_SHUTDOWN,
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson action, arg, sizeof(*event));
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley if (event == NULL) {
032d2134a4c1808696688db9bf6f20253e5d05b5Mark Andrews isc_task_detach(&cloned_task);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley result = ISC_R_NOMEMORY;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley goto unlock;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews ISC_LIST_APPEND(ctx->on_run, event, ev_link);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley result = ISC_R_SUCCESS;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley unlock:
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews UNLOCK(&ctx->lock);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley return (result);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley}
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifndef ISC_PLATFORM_USETHREADS
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * Event loop for nonthreaded programs.
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonstatic isc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉evloop(isc__appctx_t *ctx) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson isc_result_t result;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 while (!ctx->want_shutdown) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson int n;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson isc_time_t when, now;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson struct timeval tv, *tvp;
386d3a99c190bad55edf44d076e6bd087e230ab8Tatuya JINMEI 神明達哉 isc_socketwait_t *swait;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson isc_boolean_t readytasks;
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 isc_boolean_t call_timer_dispatch = ISC_FALSE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Check the reload (or suspend) case first for exiting the
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * loop as fast as possible in case:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * - the direct call to isc__taskmgr_dispatch() in
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * isc__app_ctxrun() completes all the tasks so far,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * - there is thus currently no active task, and
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * - there is a timer event
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (ctx->want_reload) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->want_reload = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (ISC_R_RELOAD);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 readytasks = isc__taskmgr_ready(ctx->taskmgr);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson if (readytasks) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tv.tv_sec = 0;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tv.tv_usec = 0;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tvp = &tv;
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 call_timer_dispatch = ISC_TRUE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson } else {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = isc__timermgr_nextevent(ctx->timermgr, &when);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson if (result != ISC_R_SUCCESS)
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tvp = NULL;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson else {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson isc_uint64_t us;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
1f1d36a87b65186d9f89aac7f456ab1fd2a39ef6Andreas Gustafsson TIME_NOW(&now);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson us = isc_time_microdiff(&when, &now);
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 if (us == 0)
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 call_timer_dispatch = ISC_TRUE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tv.tv_sec = us / 1000000;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tv.tv_usec = us % 1000000;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson tvp = &tv;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson }
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson }
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
386d3a99c190bad55edf44d076e6bd087e230ab8Tatuya JINMEI 神明達哉 swait = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 n = isc__socketmgr_waitevents(ctx->socketmgr, tvp, &swait);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 if (n == 0 || call_timer_dispatch) {
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 /*
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * We call isc__timermgr_dispatch() only when
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * necessary, in order to reduce overhead. If the
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * select() call indicates a timeout, we need the
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater * dispatch. Even if not, if we set the 0-timeout
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * for the select() call, we need to check the timer
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * events. In the 'readytasks' case, there may be no
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * timeout event actually, but there is no other way
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * to reduce the overhead.
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * Note that we do not have to worry about the case
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * where a new timer is inserted during the select()
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * call, since this loop only runs in the non-thread
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 * mode.
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__timermgr_dispatch(ctx->timermgr);
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 }
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson if (n > 0)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (void)isc__socketmgr_dispatch(ctx->socketmgr, swait);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (void)isc__taskmgr_dispatch(ctx->taskmgr);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson }
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson return (ISC_R_SUCCESS);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson}
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson/*
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * This is a gross hack to support waiting for condition
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * variables in nonthreaded programs in a limited way;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * see lib/isc/nothreads/include/isc/condition.h.
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * We implement isc_condition_wait() by entering the
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * event loop recursively until the want_shutdown flag
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * is set by isc_condition_signal().
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief True if we are currently executing in the recursive
1d90a73d6d0aa3f82c7e8d638e0013c331835eedAndreas Gustafsson * event loop.
1d90a73d6d0aa3f82c7e8d638e0013c331835eedAndreas Gustafsson */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonstatic isc_boolean_t in_recursive_evloop = ISC_FALSE;
1d90a73d6d0aa3f82c7e8d638e0013c331835eedAndreas Gustafsson
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*!
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief True if we are exiting the event loop as the result of
1d90a73d6d0aa3f82c7e8d638e0013c331835eedAndreas Gustafsson * a call to isc_condition_signal() rather than a shutdown
1d90a73d6d0aa3f82c7e8d638e0013c331835eedAndreas Gustafsson * or reload.
1d90a73d6d0aa3f82c7e8d638e0013c331835eedAndreas Gustafsson */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonstatic isc_boolean_t signalled = ISC_FALSE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonisc_result_t
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonisc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson isc_result_t result;
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson UNUSED(cp);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson UNUSED(mp);
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson INSIST(!in_recursive_evloop);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson in_recursive_evloop = ISC_TRUE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson INSIST(*mp == 1); /* Mutex must be locked on entry. */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson --*mp;
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = evloop(&isc_g_appctx);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson if (result == ISC_R_RELOAD)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.want_reload = ISC_TRUE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson if (signalled) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.want_shutdown = ISC_FALSE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson signalled = ISC_FALSE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson }
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson ++*mp;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson in_recursive_evloop = ISC_FALSE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson return (ISC_R_SUCCESS);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson}
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonisc_result_t
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonisc__nothread_signal_hack(isc_condition_t *cp) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson UNUSED(cp);
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson INSIST(in_recursive_evloop);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.want_shutdown = ISC_TRUE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson signalled = ISC_TRUE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson return (ISC_R_SUCCESS);
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson}
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson#endif /* ISC_PLATFORM_USETHREADS */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_ctxrun(isc_appctx_t *ctx0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley int result;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley isc_event_t *event, *next_event;
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley isc_task_t *task;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
ae8b7e02a8e5d7febba7d79b2c759add95a48f60Brian Wellington sigset_t sset;
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews char strbuf[ISC_STRERRORSIZE];
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#ifdef HAVE_SIGWAIT
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley int sig;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_SIGWAIT */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#ifdef HAVE_LINUXTHREADS
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley REQUIRE(main_thread == pthread_self());
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#endif
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 LOCK(&ctx->lock);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (!ctx->running) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->running = ISC_TRUE;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley /*
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley * Post any on-run events (in FIFO order).
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 for (event = ISC_LIST_HEAD(ctx->on_run);
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley event != NULL;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley event = next_event) {
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff next_event = ISC_LIST_NEXT(event, ev_link);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ISC_LIST_UNLINK(ctx->on_run, event, ev_link);
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff task = event->ev_sender;
960d37edc3f4e4d99afd26feab9bed4aa88a499cBrian Wellington event->ev_sender = NULL;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley isc_task_sendanddetach(&task, &event);
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley }
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley }
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 UNLOCK(&ctx->lock);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifndef ISC_PLATFORM_USETHREADS
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt if (isc_bind9 && ctx == &isc_g_appctx) {
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt result = handle_signal(SIGHUP, reload_action);
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt if (result != ISC_R_SUCCESS)
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt return (ISC_R_SUCCESS);
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt }
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt (void) isc__taskmgr_dispatch(ctx->taskmgr);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = evloop(ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (result);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * BIND9 internal tools using multiple contexts do not
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * rely on signal.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9 && ctx != &isc_g_appctx)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley /*
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * There is no danger if isc_app_shutdown() is called before we
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * wait for signals. Signals are blocked, so any such signal will
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * simply be made pending and we will get it when we call
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * sigwait().
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 while (!ctx->want_shutdown) {
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley#ifdef HAVE_SIGWAIT
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /*
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * BIND9 internal; single context:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * Wait for SIGHUP, SIGINT, or SIGTERM.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (sigemptyset(&sset) != 0 ||
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt sigaddset(&sset, SIGHUP) != 0 ||
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt sigaddset(&sset, SIGINT) != 0 ||
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt sigaddset(&sset, SIGTERM) != 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc__strerror(errno, strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNEXPECTED_ERROR(__FILE__, __LINE__,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_run() sigsetops: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_UNEXPECTED);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#ifndef HAVE_UNIXWARE_SIGWAIT
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = sigwait(&sset, &sig);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result == 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (sig == SIGINT || sig == SIGTERM)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_shutdown = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt else if (sig == SIGHUP)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_reload = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#else /* Using UnixWare sigwait semantics. */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt sig = sigwait(&sset);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (sig >= 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (sig == SIGINT || sig == SIGTERM)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_shutdown = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt else if (sig == SIGHUP)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_reload = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#endif /* HAVE_UNIXWARE_SIGWAIT */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt } else {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /*
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * External, or BIND9 using multiple contexts:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * wait until woken up.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt LOCK(&ctx->readylock);
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt if (ctx->want_shutdown) {
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt /* shutdown() won the race. */
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt UNLOCK(&ctx->readylock);
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt break;
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt }
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews if (!ctx->want_reload)
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews WAIT(&ctx->ready, &ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNLOCK(&ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#else /* Don't have sigwait(). */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /*
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * BIND9 internal; single context:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * Install a signal handler for SIGHUP, then wait for
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * all signals.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = handle_signal(SIGHUP, reload_action);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result != ISC_R_SUCCESS)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_SUCCESS);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (sigemptyset(&sset) != 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc__strerror(errno, strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNEXPECTED_ERROR(__FILE__, __LINE__,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_run() sigsetops: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_UNEXPECTED);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont#ifdef HAVE_GPERFTOOLS_PROFILER
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont if (sigaddset(&sset, SIGALRM) != 0) {
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont isc__strerror(errno, strbuf, sizeof(strbuf));
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont UNEXPECTED_ERROR(__FILE__, __LINE__,
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont "isc_app_run() sigsetops: %s",
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont strbuf);
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont return (ISC_R_UNEXPECTED);
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont }
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont#endif
e53e202ef3b51c58fb9abe0d15e3829a970b00e7Mark Andrews (void)sigsuspend(&sset);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt } else {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /*
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * External, or BIND9 using multiple contexts:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * wait until woken up.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt LOCK(&ctx->readylock);
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt if (ctx->want_shutdown) {
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt /* shutdown() won the race. */
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt UNLOCK(&ctx->readylock);
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt break;
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt }
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt if (!ctx->want_reload)
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt WAIT(&ctx->ready, &ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNLOCK(&ctx->readylock);
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley }
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#endif /* HAVE_SIGWAIT */
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (ctx->want_reload) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->want_reload = ISC_FALSE;
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley return (ISC_R_RELOAD);
03dd96d177e4ed6771be7fb5f86a3a9d5f17be4eBob Halley }
64dcb0811369406961cc2fc18ee5eb67d1b3a939Brian Wellington
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (ctx->want_shutdown && ctx->blocked)
2f02f32f045d0570969c775d9a64dd42d94647a6Brian Wellington exit(1);
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley }
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley return (ISC_R_SUCCESS);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley}
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
b454c0319685041db3f3e8fd7671e1b364fd20c5Evan Huntisc__app_run(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_ctxshutdown(isc_appctx_t *ctx0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley isc_boolean_t want_kill = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews char strbuf[ISC_STRERRORSIZE];
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 LOCK(&ctx->lock);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(ctx->running);
bed86971bf7eb315e9c64f75bba331917f4557cfBob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (ctx->shutdown_requested)
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley want_kill = ISC_FALSE;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley else
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->shutdown_requested = ISC_TRUE;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 UNLOCK(&ctx->lock);
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley if (want_kill) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9 && ctx != &isc_g_appctx)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, but using multiple contexts */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->want_shutdown = ISC_TRUE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 else {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifndef ISC_PLATFORM_USETHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_shutdown = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#ifdef HAVE_LINUXTHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt int result;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = pthread_kill(main_thread, SIGTERM);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result != 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc__strerror(result,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNEXPECTED_ERROR(__FILE__, __LINE__,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_shutdown() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "pthread_kill: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_UNEXPECTED);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley#else
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (kill(getpid(), SIGTERM) < 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc__strerror(errno,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNEXPECTED_ERROR(__FILE__, __LINE__,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_shutdown() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "kill: %s", strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_UNEXPECTED);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_LINUXTHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt else {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* External, multiple contexts */
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt LOCK(&ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_shutdown = ISC_TRUE;
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt UNLOCK(&ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt SIGNAL(&ctx->ready);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
a829555ed724caa56b1ff7716d7eda2266491eafBob Halley }
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley }
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley return (ISC_R_SUCCESS);
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley}
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
b454c0319685041db3f3e8fd7671e1b364fd20c5Evan Huntisc__app_shutdown(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc__app_ctxshutdown((isc_appctx_t *)&isc_g_appctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_ctxsuspend(isc_appctx_t *ctx0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley isc_boolean_t want_kill = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifdef ISC_PLATFORM_USETHREADS
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews char strbuf[ISC_STRERRORSIZE];
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 LOCK(&ctx->lock);
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(ctx->running);
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley /*
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley * Don't send the reload signal if we're shutting down.
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (ctx->shutdown_requested)
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley want_kill = ISC_FALSE;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 UNLOCK(&ctx->lock);
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley if (want_kill) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9 && ctx != &isc_g_appctx)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, but using multiple contexts */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->want_reload = ISC_TRUE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 else {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#ifndef ISC_PLATFORM_USETHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_reload = ISC_TRUE;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley#ifdef HAVE_LINUXTHREADS
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt int result;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt result = pthread_kill(main_thread, SIGHUP);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (result != 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc__strerror(result,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNEXPECTED_ERROR(__FILE__, __LINE__,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_reload() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "pthread_kill: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_UNEXPECTED);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley#else
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (isc_bind9) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (kill(getpid(), SIGHUP) < 0) {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc__strerror(errno,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt UNEXPECTED_ERROR(__FILE__, __LINE__,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_reload() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "kill: %s", strbuf);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (ISC_R_UNEXPECTED);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_LINUXTHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt else {
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* External, multiple contexts */
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt LOCK(&ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt ctx->want_reload = ISC_TRUE;
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt UNLOCK(&ctx->readylock);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt SIGNAL(&ctx->ready);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt }
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 }
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley }
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley return (ISC_R_SUCCESS);
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley}
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_reload(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc__app_ctxsuspend((isc_appctx_t *)&isc_g_appctx));
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley}
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_ctxfinish(isc_appctx_t *ctx0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 DESTROYLOCK(&ctx->lock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_finish(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxfinish((isc_appctx_t *)&isc_g_appctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_block(void) {
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington#ifdef ISC_PLATFORM_USETHREADS
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington sigset_t sset;
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(isc_g_appctx.running);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(!isc_g_appctx.blocked);
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.blocked = ISC_TRUE;
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington#ifdef ISC_PLATFORM_USETHREADS
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington blockedthread = pthread_self();
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington sigaddset(&sset, SIGINT) == 0 &&
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington sigaddset(&sset, SIGTERM) == 0);
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington RUNTIME_CHECK(pthread_sigmask(SIG_UNBLOCK, &sset, NULL) == 0);
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington}
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_unblock(void) {
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington#ifdef ISC_PLATFORM_USETHREADS
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington sigset_t sset;
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(isc_g_appctx.running);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(isc_g_appctx.blocked);
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_g_appctx.blocked = ISC_FALSE;
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington#ifdef ISC_PLATFORM_USETHREADS
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington REQUIRE(blockedthread == pthread_self());
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington RUNTIME_CHECK(sigemptyset(&sset) == 0 &&
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater sigaddset(&sset, SIGINT) == 0 &&
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington sigaddset(&sset, SIGTERM) == 0);
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0);
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(mctx != NULL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(ctxp != NULL && *ctxp == NULL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx = isc_mem_get(mctx, sizeof(*ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (ctx == NULL)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (ISC_R_NOMEMORY);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->common.impmagic = APPCTX_MAGIC;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->common.magic = ISCAPI_APPCTX_MAGIC;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->common.methods = &appmethods.methods;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->mctx = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_mem_attach(mctx, &ctx->mctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->taskmgr = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->socketmgr = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->timermgr = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 *ctxp = (isc_appctx_t *)ctx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_destroy(isc_appctx_t **ctxp) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(ctxp != NULL);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx = (isc__appctx_t *)*ctxp;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_mem_putanddetach(&ctx->mctx, ctx, sizeof(*ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 *ctxp = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_settaskmgr(isc_appctx_t *ctx0, isc_taskmgr_t *taskmgr) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->taskmgr = taskmgr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->socketmgr = socketmgr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntvoid
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(VALID_APPCTX(ctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->timermgr = timermgr;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc_result_t
b454c0319685041db3f3e8fd7671e1b364fd20c5Evan Huntisc__app_register(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc_app_register(isc__appctx_create));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#include "../app_api.c"