fatal(named_server_t *server, const char *msg, isc_result_t result);
static void
-named_server_reload(isc_task_t *task, isc_event_t *event);
+named_server_reload(void *arg);
#ifdef HAVE_LIBNGHTTP2
static isc_result_t
ns_cfgctx_t *cfg;
dns_zone_t *zone = NULL;
+ UNUSED(task);
+
cfg = (ns_cfgctx_t *)ev->view->new_zone_config;
if (cfg == NULL) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
/* Mark view unfrozen so that zone can be added */
- isc_task_beginexclusive(task);
+ isc_loopmgr_pause(named_g_loopmgr);
dns_view_thaw(ev->view);
result = configure_zone(cfg->config, zoneobj, cfg->vconfig, ev->view,
&ev->cbd->server->viewlist,
&ev->cbd->server->kasplist, cfg->actx, true,
false, ev->mod);
dns_view_freeze(ev->view);
- isc_task_endexclusive(task);
+ isc_loopmgr_resume(named_g_loopmgr);
if (result != ISC_R_SUCCESS) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
char cname[DNS_NAME_FORMATSIZE];
const char *file;
- isc_task_beginexclusive(task);
+ UNUSED(task);
+
+ isc_loopmgr_pause(named_g_loopmgr);
dns_name_format(dns_catz_entry_getname(ev->entry), cname,
DNS_NAME_FORMATSIZE);
"zone '%s' deleted",
cname);
cleanup:
- isc_task_endexclusive(task);
+ isc_loopmgr_resume(named_g_loopmgr);
if (zone != NULL) {
dns_zone_detach(&zone);
}
}
CHECKM(dns_dt_create(named_g_mctx, dmode, dpath, &fopt,
- named_g_server->task,
- &named_g_server->dtenv),
+ named_g_mainloop, &named_g_server->dtenv),
"unable to create dnstap environment");
CHECKM(dns_dt_setupfile(named_g_server->dtenv, max_size, rolls,
const void *hashinit = isc_hash_get_initializer();
CHECK(dns_dyndb_createctx(mctx, hashinit, named_g_lctx,
view, named_g_server->zonemgr,
- named_g_server->task,
named_g_loopmgr, &dctx));
}
ISC_LIST_INIT(altsecrets);
/* Ensure exclusive access to configuration data. */
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
/* Create the ACL configuration context */
if (named_g_aclconfctx != NULL) {
}
if (first_time) {
- isc_task_endexclusive(server->task);
-
/*
* Rescan the interface list to pick up changes in the
- * listen-on option.
+ * listen-on option. This requires the loopmgr to be
+ * temporarily resumed.
*/
+ isc_loopmgr_resume(named_g_loopmgr);
result = ns_interfacemgr_scan(server->interfacemgr, true, true);
-
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
/*
* Check that named is able to TCP listen on at least one
isc_result_totext(result));
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
exclusive = false;
/* Configure the statistics channel(s) */
cleanup_exclusive:
if (exclusive) {
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
}
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
zl->server = server;
zl->reconfig = reconfig;
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
isc_refcount_init(&zl->refs, 1);
isc_mem_put(server->mctx, zl, sizeof(*zl));
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
return (result);
}
static void
-run_server(isc_task_t *task, isc_event_t *event) {
+run_server(void *arg) {
isc_result_t result;
- named_server_t *server = (named_server_t *)event->ev_arg;
+ named_server_t *server = (named_server_t *)arg;
dns_geoip_databases_t *geoip = NULL;
- INSIST(task == server->task);
-
- isc_event_free(&event);
-
CHECKFATAL(dns_zonemgr_create(named_g_mctx, named_g_loopmgr,
named_g_taskmgr, named_g_netmgr,
&server->zonemgr),
#endif /* ifdef ENABLE_AFL */
}
-static void
-launch_server(void *arg) {
- named_server_t *server = (named_server_t *)arg;
- isc_event_t *event = isc_event_allocate(named_g_mctx, server->task,
- NAMED_EVENT_RUN, run_server,
- server, sizeof(*event));
- isc_task_send(server->task, &event);
-}
-
void
named_server_flushonshutdown(named_server_t *server, bool flush) {
REQUIRE(NAMED_SERVER_VALID(server));
}
static void
-shutdown_server(isc_task_t *task, isc_event_t *event) {
- dns_view_t *view, *view_next = NULL;
- dns_kasp_t *kasp, *kasp_next = NULL;
- named_server_t *server = (named_server_t *)event->ev_arg;
+shutdown_server(void *arg) {
+ named_server_t *server = (named_server_t *)arg;
+ dns_view_t *view = NULL, *view_next = NULL;
+ dns_kasp_t *kasp = NULL, *kasp_next = NULL;
bool flush = server->flushonshutdown;
- named_cache_t *nsc;
-
- INSIST(task == server->task);
-
- isc_event_free(&event);
+ named_cache_t *nsc = NULL;
#if HAVE_LIBSYSTEMD
sd_notify(0, "STOPPING=1\n");
#endif /* HAVE_LIBSYSTEMD */
+ isc_signal_stop(server->sighup);
+ isc_signal_destroy(&server->sighup);
+
/*
* We need to shutdown the interface before going
* exclusive (which would pause the netmgr).
named_statschannels_shutdown(server);
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO, "shutting down%s",
dns_db_detach(&server->in_roothints);
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
isc_task_detach(&server->task);
}
-static void
-close_server(void *arg) {
- named_server_t *server = arg;
-
- /*
- * Cleanup loopmgr resources directly, because shuttingdown the server
- * happens on async task
- */
- isc_signal_stop(server->sighup);
- isc_signal_destroy(&server->sighup);
-
- isc_event_t *event = isc_event_allocate(
- named_g_mctx, server->task, NAMED_EVENT_SHUTDOWN,
- shutdown_server, server, sizeof(*event));
- isc_task_send(server->task, &event);
-}
-
-void
-named_server_shutdown(named_server_t *server) {
- isc_event_t *event =
- isc_event_allocate(named_g_mctx, server, NAMED_EVENT_SHUTDOWN,
- shutdown_server, server, sizeof(*event));
- isc_task_send(server->task, &event);
-}
-
/*%
* Find a view that matches the source and destination addresses of a query.
*/
named_g_mainloop = isc_loop_main(named_g_loopmgr);
- isc_loop_setup(named_g_mainloop, launch_server, server);
- isc_loop_teardown(named_g_mainloop, close_server, server);
+ isc_loop_setup(named_g_mainloop, run_server, server);
+ isc_loop_teardown(named_g_mainloop, shutdown_server, server);
/* Add SIGHUP reload handler */
server->sighup = isc_signal_new(
* function and any other OpenSSL calls from other tasks
* by requesting exclusive access to the task manager.
*/
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
}
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_CRITICAL, "%s: %s", msg,
* Handle a reload event (from SIGHUP).
*/
static void
-named_server_reload(isc_task_t *task, isc_event_t *event) {
- named_server_t *server = (named_server_t *)event->ev_sender;
-
- INSIST(task == server->task);
+named_server_reload(void *arg) {
+ named_server_t *server = (named_server_t *)arg;
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"received SIGHUP signal to reload zones");
(void)reload(server);
-
- isc_event_free(&event);
}
void
REQUIRE(signum == SIGHUP);
- isc_event_t *event = isc_event_allocate(
- named_g_mctx, server, NAMED_EVENT_RELOAD, named_server_reload,
- NULL, sizeof(isc_event_t));
- isc_task_send(server->task, &event);
+ isc_async_run(named_g_mainloop, named_server_reload, server);
}
void
/* Look for the view name. */
ptr = next_token(lex, text);
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
view = ISC_LIST_NEXT(view, link))
{
result = ISC_R_FAILURE;
}
cleanup:
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
return (result);
}
/* Look for the view name. */
ptr = next_token(lex, NULL);
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
flushed = true;
found = false;
result = ISC_R_FAILURE;
}
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
return (result);
}
/* Look for the view name. */
viewname = next_token(lex, NULL);
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
flushed = true;
found = false;
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
}
result = ISC_R_FAILURE;
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
return (result);
}
viewname = next_token(lex, text);
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
view = ISC_LIST_NEXT(view, link))
{
isc_rwlocktype_write);
if (result != ISC_R_SUCCESS) {
isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
return (result);
}
}
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
snprintf(fbuf, sizeof(fbuf), "%u", foundkeys);
isc_result_t
named_server_sync(named_server_t *server, isc_lex_t *lex, isc_buffer_t **text) {
isc_result_t result, tresult;
- dns_view_t *view;
+ dns_view_t *view = NULL;
dns_zone_t *zone = NULL;
char classstr[DNS_RDATACLASS_FORMATSIZE];
char zonename[DNS_NAME_FORMATSIZE];
- const char *vname, *sep, *arg;
+ const char *vname = NULL, *sep = NULL, *arg = NULL;
bool cleanup = false;
REQUIRE(text != NULL);
}
if (zone == NULL) {
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
tresult = ISC_R_SUCCESS;
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
view = ISC_LIST_NEXT(view, link))
tresult = result;
}
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"dumping all zones%s: %s",
return (tresult);
}
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
result = synczone(zone, &cleanup);
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
view = dns_zone_getview(zone);
if (strcmp(view->name, "_default") == 0 ||
return (result);
}
if (mayberaw == NULL) {
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
tresult = ISC_R_SUCCESS;
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
view = ISC_LIST_NEXT(view, link))
tresult = result;
}
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_INFO,
"%s all zones: %s",
return (DNS_R_NOTDYNAMIC);
}
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
frozen = dns_zone_getupdatedisabled(mayberaw);
if (freeze) {
if (frozen) {
}
}
}
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
if (msg != NULL) {
(void)putstr(text, msg);
goto cleanup;
}
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
#ifndef HAVE_LMDB
/*
*/
result = isc_stdio_open(view->new_zone_file, "a", &fp);
if (result != ISC_R_SUCCESS) {
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
TCHECK(putstr(text, "unable to create '"));
TCHECK(putstr(text, view->new_zone_file));
TCHECK(putstr(text, "': "));
/* Make sure we can open the NZD database */
result = nzd_writable(view);
if (result != ISC_R_SUCCESS) {
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
TCHECK(putstr(text, "unable to open NZD database for '"));
TCHECK(putstr(text, view->new_zone_db));
TCHECK(putstr(text, "'"));
true, false, false);
dns_view_freeze(view);
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
if (result != ISC_R_SUCCESS) {
TCHECK(putstr(text, "configure_zone failed: "));
}
#endif /* ifndef HAVE_LMDB */
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
#ifndef HAVE_LMDB
/* Make sure we can open the configuration save file */
TCHECK(putstr(text, view->new_zone_file));
TCHECK(putstr(text, "': "));
TCHECK(putstr(text, isc_result_totext(result)));
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
goto cleanup;
}
(void)isc_stdio_close(fp);
TCHECK(putstr(text, view->new_zone_db));
TCHECK(putstr(text, "'"));
result = ISC_R_FAILURE;
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
goto cleanup;
}
#endif /* HAVE_LMDB */
true, false, true);
dns_view_freeze(view);
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
if (result != ISC_R_SUCCESS) {
TCHECK(putstr(text, "configure_zone failed: "));
isc_stdtime_get(&now);
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
view = ISC_LIST_NEXT(view, link))
{
}
cleanup_exclusive:
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
cleanup:
}
static isc_result_t
-mkey_destroy(named_server_t *server, dns_view_t *view, isc_buffer_t **text) {
+mkey_destroy(dns_view_t *view, isc_buffer_t **text) {
isc_result_t result;
char msg[DNS_NAME_FORMATSIZE + 500] = "";
const char *file = NULL;
view->name);
CHECK(putstr(text, msg));
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
/* Remove and clean up managed keys zone from view */
mkzone = view->managed_keys;
result = ISC_R_SUCCESS;
cleanup:
- isc_task_endexclusive(server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
return (result);
}
if (!first) {
CHECK(putstr(text, "\n"));
}
- CHECK(mkey_destroy(server, view, text));
+ CHECK(mkey_destroy(view, text));
break;
default:
UNREACHABLE();
CHECK(ISC_R_RANGE);
}
- isc_task_beginexclusive(named_g_server->task);
-
isc_nm_settimeouts(named_g_netmgr, initial, idle, keepalive,
advertised);
-
- isc_task_endexclusive(named_g_server->task);
}
snprintf(msg, sizeof(msg), "tcp-initial-timeout=%u\n", initial / 100);
}
}
- isc_task_beginexclusive(server->task);
+ isc_loopmgr_pause(named_g_loopmgr);
for (view = ISC_LIST_HEAD(server->viewlist); view != NULL;
view = ISC_LIST_NEXT(view, link))
}
cleanup:
- isc_task_endexclusive(named_g_server->task);
+ isc_loopmgr_resume(named_g_loopmgr);
if (isc_buffer_usedlength(*text) > 0) {
(void)putnull(text);
#include <stdbool.h>
#include <stdlib.h>
+#include <isc/async.h>
#include <isc/buffer.h>
#include <isc/file.h>
#include <isc/log.h>
#include <isc/once.h>
#include <isc/result.h>
#include <isc/sockaddr.h>
-#include <isc/task.h>
#include <isc/thread.h>
#include <isc/time.h>
#include <isc/types.h>
isc_refcount_t refcount;
isc_mem_t *mctx;
+ isc_loop_t *loop;
struct fstrm_iothr *iothr;
struct fstrm_iothr_options *fopt;
- isc_task_t *reopen_task;
- isc_mutex_t reopen_lock; /* locks 'reopen_queued'
- * */
+ isc_mutex_t reopen_lock; /* locks 'reopen_queued' */
bool reopen_queued;
isc_region_t identity;
isc_result_t
dns_dt_create(isc_mem_t *mctx, dns_dtmode_t mode, const char *path,
- struct fstrm_iothr_options **foptp, isc_task_t *reopen_task,
+ struct fstrm_iothr_options **foptp, isc_loop_t *loop,
dns_dtenv_t **envp) {
isc_result_t result = ISC_R_SUCCESS;
fstrm_res res;
env = isc_mem_get(mctx, sizeof(*env));
*env = (dns_dtenv_t){
- .reopen_task = reopen_task,
+ .loop = loop,
.reopen_queued = false,
};
struct fstrm_file_options *ffwopt = NULL;
struct fstrm_writer_options *fwopt = NULL;
struct fstrm_writer *fw = NULL;
+ isc_loopmgr_t *loopmgr = NULL;
REQUIRE(VALID_DTENV(env));
- /*
- * Run in task-exclusive mode.
- */
- isc_task_beginexclusive(env->reopen_task);
+ loopmgr = isc_loop_getloopmgr(env->loop);
+ isc_loopmgr_pause(loopmgr);
/*
* Check that we can create a new fw object.
fstrm_writer_options_destroy(&fwopt);
}
- isc_task_endexclusive(env->reopen_task);
+ isc_loopmgr_resume(loopmgr);
return (result);
}
}
/*%
- * Invoke dns_dt_reopen() and re-allow dnstap output file rolling. This
- * function is run in the context of the task stored in the 'reopen_task' field
- * of the dnstap environment structure.
+ * Invoke dns_dt_reopen() and re-allow dnstap output file rolling.
*/
static void
-perform_reopen(isc_task_t *task, isc_event_t *event) {
- dns_dtenv_t *env;
-
- REQUIRE(event != NULL);
- REQUIRE(event->ev_type == DNS_EVENT_FREESTORAGE);
-
- env = (dns_dtenv_t *)event->ev_arg;
+perform_reopen(void *arg) {
+ dns_dtenv_t *env = (dns_dtenv_t *)arg;
REQUIRE(VALID_DTENV(env));
- REQUIRE(task == env->reopen_task);
- /*
- * Roll output file in the context of env->reopen_task.
- */
+ /* Roll output file. */
dns_dt_reopen(env, env->rolls);
- /*
- * Clean up.
- */
- isc_event_free(&event);
- isc_task_detach(&task);
-
- /*
- * Re-allow output file rolling.
- */
+ /* Re-allow output file rolling. */
LOCK(&env->reopen_lock);
env->reopen_queued = false;
UNLOCK(&env->reopen_lock);
*/
static void
check_file_size_and_maybe_reopen(dns_dtenv_t *env) {
- isc_task_t *reopen_task = NULL;
- isc_event_t *event;
struct stat statbuf;
- /*
- * If the task from which the output file should be reopened was not
- * specified, abort.
- */
- if (env->reopen_task == NULL) {
+ /* If a loopmgr wasn't specified, abort. */
+ if (env->loop == NULL) {
return;
}
}
/*
- * We need to roll the output file, but it needs to be done in the
- * context of env->reopen_task. Allocate and send an event to achieve
- * that, then disallow output file rolling until the roll we queue is
- * completed.
+ * Send an event to roll the output file, then disallow output file
+ * rolling until the roll we queue is completed.
*/
- event = isc_event_allocate(env->mctx, NULL, DNS_EVENT_FREESTORAGE,
- perform_reopen, env, sizeof(*event));
- isc_task_attach(env->reopen_task, &reopen_task);
- isc_task_send(reopen_task, &event);
+ isc_async_run(env->loop, perform_reopen, env);
env->reopen_queued = true;
unlock_and_return: