8664a1bd40814ed0b42eacfc5eb354b598dfd6dfTinderbox User * Copyright (C) 1999-2005, 2007-2009, 2013-2017 Internet Systems Consortium, Inc. ("ISC")
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/.
26cf4737b3e84c3a686a5eacebf22ac39e57d4caMark Andrews#include <sys/param.h> /* Openserver 5.0.6A and FD_SETSIZE */
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.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
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.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_onrun(isc_mem_t *mctx, isc_task_t *task,
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_ctxshutdown(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__app_ctxsuspend(isc_appctx_t *ctx);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Huntisc_result_t isc__appctx_create(isc_mem_t *mctx, 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,
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 神明達哉#define APPCTX_MAGIC ISC_MAGIC('A', 'p', 'c', 'x')
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#define VALID_APPCTX(c) ISC_MAGIC_VALID(c, APPCTX_MAGIC)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * We assume that 'want_shutdown' can be read and written atomically.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * We assume that 'want_reload' can be read and written atomically.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static struct {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * The following are defined just for avoiding unused static functions.
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews void *run, *shutdown, *start, *reload, *finish, *block, *unblock;
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 * We need to remember which thread is the main thread...
9cd6d409b78a6f833b681c13a68fbdc7c024fe66David Lawrence "handle_signal() %d setup: %s"),
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * Start an ISC library application.
96f55bdc736f8559b3a57260db6f0e964c44070dBob Halley * BSDI 3.1 seg faults in pthread_sigmask() if we don't do this.
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(presult, strbuf, sizeof(strbuf));
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_LINUXTHREADS */
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
634a52966f2324e6d5ceda191fd873ba1cfeb936Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
0e58c0998df1ccd1a289b2c3f078e7d03d9331d3Bob Halley * Install do-nothing handlers for SIGINT and SIGTERM.
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().
dd324bd791a766c48d90ce9e43d1ab1446378983Bob Halley * Always ignore SIGPIPE.
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.
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley * Block SIGHUP, SIGINT, SIGTERM.
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 presult = pthread_sigmask(SIG_BLOCK, &sset, NULL);
4b87939256ede703385e9cab92d3c58d03c31098Mark Andrews isc__strerror(presult, strbuf, sizeof(strbuf));
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence "isc_app_start() pthread_sigmask: %s",
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington#else /* ISC_PLATFORM_USETHREADS */
48565891e8f2f8c77b87908b4893f693a08e9ba9Brian Wellington * Unblock SIGHUP, SIGINT, SIGTERM.
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 presult = sigprocmask(SIG_UNBLOCK, &sset, NULL);
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_g_appctx.common.methods = &appmethods.methods;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* The remaining members will be initialized in ctxstart() */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt return (isc__app_ctxstart((isc_appctx_t *)&isc_g_appctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrews return (isc__app_ctxonrun((isc_appctx_t *)&isc_g_appctx, mctx,
62f016d5d301713c72a59e83d3ab41170a77f674Mark Andrewsisc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task,
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 event = isc_event_allocate(mctx, cloned_task, ISC_APPEVENT_SHUTDOWN,
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson * Event loop for nonthreaded programs.
6da7c87a77ecfd9ccce36f96b4ccd20e1b9cccf1Tatuya JINMEI 神明達哉 isc_boolean_t call_timer_dispatch = ISC_FALSE;
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 神明達哉 readytasks = isc__taskmgr_ready(ctx->taskmgr);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = isc__timermgr_nextevent(ctx->timermgr, &when);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 n = isc__socketmgr_waitevents(ctx->socketmgr, tvp, &swait);
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
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (void)isc__socketmgr_dispatch(ctx->socketmgr, swait);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 (void)isc__taskmgr_dispatch(ctx->taskmgr);
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().
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * \brief True if we are currently executing in the recursive
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonstatic isc_boolean_t in_recursive_evloop = ISC_FALSE;
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
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonstatic isc_boolean_t signalled = ISC_FALSE;
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonisc__nothread_wait_hack(isc_condition_t *cp, isc_mutex_t *mp) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson INSIST(*mp == 1); /* Mutex must be locked on entry. */
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafssonisc__nothread_signal_hack(isc_condition_t *cp) {
8e7ce54bef167f582c675ac76c373009595578a3Andreas Gustafsson#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_SIGWAIT */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley * Post any on-run events (in FIFO order).
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ISC_LIST_UNLINK(ctx->on_run, event, ev_link);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * BIND9 internal tools using multiple contexts do not
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * rely on signal.
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().
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * BIND9 internal; single context:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * Wait for SIGHUP, SIGINT, or SIGTERM.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_run() sigsetops: %s",
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#else /* Using UnixWare sigwait semantics. */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (sig >= 0) {
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#endif /* HAVE_UNIXWARE_SIGWAIT */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * External, or BIND9 using multiple contexts:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * wait until woken up.
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt /* shutdown() won the race. */
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#else /* Don't have sigwait(). */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * BIND9 internal; single context:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * Install a signal handler for SIGHUP, then wait for
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * all signals.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_run() sigsetops: %s",
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont isc__strerror(errno, strbuf, sizeof(strbuf));
1831311ac6179951c8fcca75aa29dc2f5c0218b9Francis Dupont "isc_app_run() sigsetops: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * External, or BIND9 using multiple contexts:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt * wait until woken up.
eb4458b4784a2206d939f9c4cfed4b37b076b5bcEvan Hunt /* shutdown() won the race. */
e8336c458cca9289f34dc5cb58fc0b5769502649David Lawrence#endif /* HAVE_SIGWAIT */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc__app_ctxrun((isc_appctx_t *)&isc_g_appctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__app_ctxshutdown(isc_appctx_t *ctx0) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, but using multiple contexts */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_shutdown() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "pthread_kill: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_shutdown() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_LINUXTHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* External, multiple contexts */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc__app_ctxshutdown((isc_appctx_t *)&isc_g_appctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
97f1a75cf072c2cab98b4bc28c4d2491cfcd3086Bob Halley * Don't send the reload signal if we're shutting down.
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, but using multiple contexts */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#else /* ISC_PLATFORM_USETHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_reload() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "pthread_kill: %s",
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* BIND9 internal, single context */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt "isc_app_reload() "
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* HAVE_LINUXTHREADS */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt /* External, multiple contexts */
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (isc__app_ctxsuspend((isc_appctx_t *)&isc_g_appctx));
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__app_ctxfinish((isc_appctx_t *)&isc_g_appctx);
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington RUNTIME_CHECK(pthread_sigmask(SIG_UNBLOCK, &sset, NULL) == 0);
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
1b32bc7da1da9059abd68d6dd15b23e8a442afa3Brian Wellington RUNTIME_CHECK(pthread_sigmask(SIG_BLOCK, &sset, NULL) == 0);
0d89afffb26d5e53a761fc425dab3dda07c7e191Brian Wellington#endif /* ISC_PLATFORM_USETHREADS */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_create(isc_mem_t *mctx, isc_appctx_t **ctxp) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 ctx->common.methods = &appmethods.methods;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_destroy(isc_appctx_t **ctxp) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_mem_putanddetach(&ctx->mctx, ctx, sizeof(*ctx));
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 神明達哉isc__appctx_setsocketmgr(isc_appctx_t *ctx0, isc_socketmgr_t *socketmgr) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc__appctx_settimermgr(isc_appctx_t *ctx0, isc_timermgr_t *timermgr) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc__appctx_t *ctx = (isc__appctx_t *)ctx0;