#include <dns/time.h>
#include <dns/ttl.h>
+#include "dns/types.h"
+
/*!
* Grow the number of dns_rdatalist_t (#RDLSZ) and dns_rdata_t (#RDSZ)
* structures by these sizes when we need to.
return ISC_R_SUCCESS;
}
-void
-dns_loadctx_attach(dns_loadctx_t *source, dns_loadctx_t **target) {
- REQUIRE(target != NULL && *target == NULL);
- REQUIRE(DNS_LCTX_VALID(source));
-
- isc_refcount_increment(&source->references);
-
- *target = source;
-}
-
-void
-dns_loadctx_detach(dns_loadctx_t **lctxp) {
- dns_loadctx_t *lctx;
-
- REQUIRE(lctxp != NULL);
- lctx = *lctxp;
- *lctxp = NULL;
- REQUIRE(DNS_LCTX_VALID(lctx));
-
- if (isc_refcount_decrement(&lctx->references) == 1) {
- loadctx_destroy(lctx);
- }
-}
+ISC_REFCOUNT_DECL(dns_loadctx);
+ISC_REFCOUNT_IMPL(dns_loadctx, loadctx_destroy);
static void
incctx_destroy(isc_mem_t *mctx, dns_incctx_t *ictx) {
dns_loadctx_detach(&lctx);
}
+static void
+load_enqueue(void *lctx) {
+ isc_work_enqueue(isc_loop(), load, load_done, lctx);
+}
+
+static void
+dns_loadctx_enqueue(isc_loop_t *loop, dns_loadctx_t *lctx) {
+ dns_loadctx_ref(lctx);
+ if (loop == isc_loop()) {
+ load_enqueue(lctx);
+ } else {
+ isc_async_run(loop, load_enqueue, lctx);
+ }
+}
+
isc_result_t
dns_master_loadfileasync(const char *master_file, dns_name_t *top,
dns_name_t *origin, dns_rdataclass_t zclass,
return result;
}
- dns_loadctx_attach(lctx, lctxp);
- isc_work_enqueue(loop, load, load_done, lctx);
+ dns_loadctx_enqueue(loop, lctx);
+ *lctxp = lctx;
return ISC_R_SUCCESS;
}
isc_mem_putanddetach(&dctx->mctx, dctx, sizeof(*dctx));
}
-void
-dns_dumpctx_attach(dns_dumpctx_t *source, dns_dumpctx_t **target) {
- REQUIRE(DNS_DCTX_VALID(source));
- REQUIRE(target != NULL && *target == NULL);
-
- isc_refcount_increment(&source->references);
-
- *target = source;
-}
-
-void
-dns_dumpctx_detach(dns_dumpctx_t **dctxp) {
- dns_dumpctx_t *dctx;
-
- REQUIRE(dctxp != NULL);
- dctx = *dctxp;
- *dctxp = NULL;
- REQUIRE(DNS_DCTX_VALID(dctx));
-
- if (isc_refcount_decrement(&dctx->references) == 1) {
- dumpctx_destroy(dctx);
- }
-}
+ISC_REFCOUNT_DECL(dns_dumpctx);
+ISC_REFCOUNT_IMPL(dns_dumpctx, dumpctx_destroy);
isc_result_t
dns_dumpctx_serial(dns_dumpctx_t *dctx, uint32_t *serial) {
return result;
}
+static void
+master_dump_enqueue(void *dctx) {
+ isc_work_enqueue(isc_loop(), master_dump_cb, master_dump_done_cb, dctx);
+}
+
+static void
+dns_dumpctx_enqueue(isc_loop_t *loop, dns_dumpctx_t *dctx) {
+ dns_dumpctx_ref(dctx);
+ if (loop == isc_loop()) {
+ master_dump_enqueue(dctx);
+ } else {
+ isc_async_run(loop, master_dump_enqueue, dctx);
+ }
+}
+
isc_result_t
dns_master_dumptostreamasync(isc_mem_t *mctx, dns_db_t *db,
dns_dbversion_t *version,
dctx->done = done;
dctx->done_arg = done_arg;
- dns_dumpctx_attach(dctx, dctxp);
- isc_work_enqueue(loop, master_dump_cb, master_dump_done_cb, dctx);
+ dns_dumpctx_enqueue(loop, dctx);
+ *dctxp = dctx;
return ISC_R_SUCCESS;
}
dctx->file = file;
dctx->tmpfile = tempname;
- dns_dumpctx_attach(dctx, dctxp);
- isc_work_enqueue(loop, master_dump_cb, master_dump_done_cb, dctx);
+ dns_dumpctx_enqueue(loop, dctx);
+ *dctxp = dctx;
return ISC_R_SUCCESS;