result = isc_ht_add(catzs->zones, catz->name.ndata, catz->name.length,
catz);
if (result != ISC_R_SUCCESS) {
- dns_catz_zone_detach(&catz);
+ dns_catz_detach_catz(&catz);
if (result != ISC_R_EXISTS) {
goto cleanup;
}
return (found);
}
-void
-dns_catz_catzs_attach(dns_catz_zones_t *catzs, dns_catz_zones_t **catzsp) {
- REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
- REQUIRE(catzsp != NULL && *catzsp == NULL);
-
- isc_refcount_increment(&catzs->references);
- *catzsp = catzs;
-}
-
-void
-dns_catz_zone_attach(dns_catz_zone_t *catz, dns_catz_zone_t **catzp) {
- REQUIRE(catzp != NULL && *catzp == NULL);
-
- isc_refcount_increment(&catz->references);
- *catzp = catz;
-}
+static void
+dns__catz_zone_destroy(dns_catz_zone_t *catz) {
+ isc_mem_t *mctx = catz->catzs->mctx;
-void
-dns_catz_zone_detach(dns_catz_zone_t **catzp) {
- REQUIRE(catzp != NULL && *catzp != NULL);
- dns_catz_zone_t *catz = *catzp;
- *catzp = NULL;
+ if (catz->entries != NULL) {
+ isc_ht_iter_t *iter = NULL;
+ isc_result_t result;
+ isc_ht_iter_create(catz->entries, &iter);
+ for (result = isc_ht_iter_first(iter); result == ISC_R_SUCCESS;
+ result = isc_ht_iter_delcurrent_next(iter))
+ {
+ dns_catz_entry_t *entry = NULL;
- if (isc_refcount_decrement(&catz->references) == 1) {
- isc_mem_t *mctx = catz->catzs->mctx;
- isc_refcount_destroy(&catz->references);
- if (catz->entries != NULL) {
- isc_ht_iter_t *iter = NULL;
- isc_result_t result;
- isc_ht_iter_create(catz->entries, &iter);
- for (result = isc_ht_iter_first(iter);
- result == ISC_R_SUCCESS;
- result = isc_ht_iter_delcurrent_next(iter))
- {
- dns_catz_entry_t *entry = NULL;
+ isc_ht_iter_current(iter, (void **)&entry);
+ dns_catz_entry_detach(catz, &entry);
+ }
+ INSIST(result == ISC_R_NOMORE);
+ isc_ht_iter_destroy(&iter);
- isc_ht_iter_current(iter, (void **)&entry);
- dns_catz_entry_detach(catz, &entry);
- }
- INSIST(result == ISC_R_NOMORE);
- isc_ht_iter_destroy(&iter);
+ /* The hashtable has to be empty now. */
+ INSIST(isc_ht_count(catz->entries) == 0);
+ isc_ht_destroy(&catz->entries);
+ }
+ if (catz->coos != NULL) {
+ isc_ht_iter_t *iter = NULL;
+ isc_result_t result;
+ isc_ht_iter_create(catz->coos, &iter);
+ for (result = isc_ht_iter_first(iter); result == ISC_R_SUCCESS;
+ result = isc_ht_iter_delcurrent_next(iter))
+ {
+ dns_catz_coo_t *coo = NULL;
- /* The hashtable has to be empty now. */
- INSIST(isc_ht_count(catz->entries) == 0);
- isc_ht_destroy(&catz->entries);
+ isc_ht_iter_current(iter, (void **)&coo);
+ catz_coo_detach(catz, &coo);
}
- if (catz->coos != NULL) {
- isc_ht_iter_t *iter = NULL;
- isc_result_t result;
- isc_ht_iter_create(catz->coos, &iter);
- for (result = isc_ht_iter_first(iter);
- result == ISC_R_SUCCESS;
- result = isc_ht_iter_delcurrent_next(iter))
- {
- dns_catz_coo_t *coo = NULL;
+ INSIST(result == ISC_R_NOMORE);
+ isc_ht_iter_destroy(&iter);
- isc_ht_iter_current(iter, (void **)&coo);
- catz_coo_detach(catz, &coo);
- }
- INSIST(result == ISC_R_NOMORE);
- isc_ht_iter_destroy(&iter);
+ /* The hashtable has to be empty now. */
+ INSIST(isc_ht_count(catz->coos) == 0);
+ isc_ht_destroy(&catz->coos);
+ }
+ catz->magic = 0;
+ isc_timer_destroy(&catz->updatetimer);
+ if (catz->db_registered) {
+ dns_db_updatenotify_unregister(
+ catz->db, dns_catz_dbupdate_callback, catz->catzs);
+ }
+ if (catz->dbversion != NULL) {
+ dns_db_closeversion(catz->db, &catz->dbversion, false);
+ }
+ if (catz->db != NULL) {
+ dns_db_detach(&catz->db);
+ }
- /* The hashtable has to be empty now. */
- INSIST(isc_ht_count(catz->coos) == 0);
- isc_ht_destroy(&catz->coos);
- }
- catz->magic = 0;
- isc_timer_destroy(&catz->updatetimer);
- if (catz->db_registered) {
- dns_db_updatenotify_unregister(
- catz->db, dns_catz_dbupdate_callback,
- catz->catzs);
- }
- if (catz->dbversion) {
- dns_db_closeversion(catz->db, &catz->dbversion, false);
- }
- if (catz->db != NULL) {
- dns_db_detach(&catz->db);
- }
+ dns_name_free(&catz->name, mctx);
+ dns_catz_options_free(&catz->defoptions, mctx);
+ dns_catz_options_free(&catz->zoneoptions, mctx);
- dns_name_free(&catz->name, mctx);
- dns_catz_options_free(&catz->defoptions, mctx);
- dns_catz_options_free(&catz->zoneoptions, mctx);
+ catz->catzs = NULL;
+ isc_refcount_destroy(&catz->references);
- catz->catzs = NULL;
- isc_mem_put(mctx, catz, sizeof(*catz));
- }
+ isc_mem_put(mctx, catz, sizeof(*catz));
}
-void
-dns_catz_catzs_detach(dns_catz_zones_t **catzsp) {
- dns_catz_zones_t *catzs;
-
- REQUIRE(catzsp != NULL && DNS_CATZ_ZONES_VALID(*catzsp));
-
- catzs = *catzsp;
- *catzsp = NULL;
-
- if (isc_refcount_decrement(&catzs->references) == 1) {
- catzs->magic = 0;
- isc_task_destroy(&catzs->updater);
- isc_mutex_destroy(&catzs->lock);
- if (catzs->zones != NULL) {
- isc_ht_iter_t *iter = NULL;
- isc_result_t result;
- isc_ht_iter_create(catzs->zones, &iter);
- for (result = isc_ht_iter_first(iter);
- result == ISC_R_SUCCESS;)
- {
- dns_catz_zone_t *catz = NULL;
- isc_ht_iter_current(iter, (void **)&catz);
- result = isc_ht_iter_delcurrent_next(iter);
- dns_catz_zone_detach(&catz);
- }
- INSIST(result == ISC_R_NOMORE);
- isc_ht_iter_destroy(&iter);
- INSIST(isc_ht_count(catzs->zones) == 0);
- isc_ht_destroy(&catzs->zones);
+static void
+dns__catz_zones_destroy(dns_catz_zones_t *catzs) {
+ if (catzs->zones != NULL) {
+ isc_ht_iter_t *iter = NULL;
+ isc_result_t result;
+ isc_ht_iter_create(catzs->zones, &iter);
+ for (result = isc_ht_iter_first(iter); result == ISC_R_SUCCESS;)
+ {
+ dns_catz_zone_t *zone = NULL;
+ isc_ht_iter_current(iter, (void **)&zone);
+ result = isc_ht_iter_delcurrent_next(iter);
+ dns_catz_detach_catz(&zone);
}
- isc_refcount_destroy(&catzs->references);
- isc_mem_putanddetach(&catzs->mctx, catzs, sizeof(*catzs));
+ INSIST(result == ISC_R_NOMORE);
+ isc_ht_iter_destroy(&iter);
+ INSIST(isc_ht_count(catzs->zones) == 0);
+ isc_ht_destroy(&catzs->zones);
}
+ catzs->magic = 0;
+ isc_task_destroy(&catzs->updater);
+ isc_mutex_destroy(&catzs->lock);
+ isc_refcount_destroy(&catzs->references);
+
+ isc_mem_putanddetach(&catzs->mctx, catzs, sizeof(*catzs));
}
+#ifdef DNS_CATZ_TRACE
+ISC_REFCOUNT_TRACE_IMPL(dns_catz_zone, dns__catz_zone_destroy);
+ISC_REFCOUNT_TRACE_IMPL(dns_catz_zones, dns__catz_zones_destroy);
+#else
+ISC_REFCOUNT_IMPL(dns_catz_zone, dns__catz_zone_destroy);
+ISC_REFCOUNT_IMPL(dns_catz_zones, dns__catz_zones_destroy);
+#endif
+
typedef enum {
CATZ_OPT_NONE,
CATZ_OPT_ZONES,
result = dns_db_createiterator(db, DNS_DB_NONSEC3, &it);
if (result != ISC_R_SUCCESS) {
- dns_catz_zone_detach(&newcatz);
+ dns_catz_detach_catz(&newcatz);
dns_db_closeversion(db, &oldcatz->dbversion, false);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
result = dns_name_fromstring2(name, "version", &db->origin, 0, NULL);
if (result != ISC_R_SUCCESS) {
dns_dbiterator_destroy(&it);
- dns_catz_zone_detach(&newcatz);
+ dns_catz_detach_catz(&newcatz);
dns_db_closeversion(db, &oldcatz->dbversion, false);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
"catz: new catalog zone '%s' is broken and "
"will not be processed",
bname);
- dns_catz_zone_detach(&newcatz);
+ dns_catz_detach_catz(&newcatz);
return;
}
* Finally merge new zone into old zone.
*/
result = dns_catz_zones_merge(oldcatz, newcatz);
- dns_catz_zone_detach(&newcatz);
+ dns_catz_detach_catz(&newcatz);
if (result != ISC_R_SUCCESS) {
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_ERROR,
&catz->name);
INSIST(result == ISC_R_SUCCESS);
dns_catz_zones_merge(catz, newcatz);
- dns_catz_zone_detach(&newcatz);
+ dns_catz_detach_catz(&newcatz);
/* Make sure that we have an empty catalog zone. */
INSIST(isc_ht_count(catz->entries) == 0);
result = isc_ht_iter_delcurrent_next(iter);
- dns_catz_zone_detach(&catz);
+ dns_catz_detach_catz(&catz);
} else {
result = isc_ht_iter_next(iter);
}
#pragma once
+/*
+ * Define this for reference count tracing in the unit
+ */
+#undef DNS_CATZ_TRACE
+
#include <inttypes.h>
#include <stdbool.h>
* \li 'false' if the entries differ.
*/
-void
-dns_catz_zone_attach(dns_catz_zone_t *zone, dns_catz_zone_t **zonep);
-/*%<
- * Attach a catzone
- *
- * Requires:
- * \li 'zone' is a valid dns_catz_zone_t.
- * \li 'zonep' is not NULL and '*zonep' is NULL.
- */
-
-void
-dns_catz_zone_detach(dns_catz_zone_t **zonep);
-/*%<
- * Detach a zone, free if no further references
- *
- * Requires:
- * \li 'zonep' is not NULL and '*zonep' is not NULL.
- */
-
isc_result_t
dns_catz_new_zone(dns_catz_zones_t *catzs, dns_catz_zone_t **catzp,
const dns_name_t *name);
* \li 'name' is a valid dns_name_t.
*/
-void
-dns_catz_catzs_attach(dns_catz_zones_t *catzs, dns_catz_zones_t **catzsp);
-/*%<
- * Attach 'catzs' to 'catzsp'.
- *
- * Requires:
- * \li 'catzs' is a valid dns_catz_zones_t.
- * \li 'catzsp' is not NULL and *catzsp is NULL.
- */
-
-void
-dns_catz_catzs_detach(dns_catz_zones_t **catzsp);
-/*%<
- * Detach 'catzsp', free if no further references.
- *
- * Requires:
- * \li 'catzsp' is not NULL and *catzsp is not NULL.
- */
-
void
dns_catz_catzs_set_view(dns_catz_zones_t *catzs, dns_view_t *view);
/*%<
*
*/
+#ifdef DNS_CATZ_TRACE
+/* Compatibility macros */
+#define dns_catz_attach_catz(catz, catzp) \
+ dns_catz_zone__attach(catz, catzp, __func__, __FILE__, __LINE__)
+#define dns_catz_detach_catz(catzp) \
+ dns_catz_zone__detach(catzp, __func__, __FILE__, __LINE__)
+#define dns_catz_ref_catz(ptr) \
+ dns_catz_zone__ref(ptr, __func__, __FILE__, __LINE__)
+#define dns_catz_unref_catz(ptr) \
+ dns_catz_zone__unref(ptr, __func__, __FILE__, __LINE__)
+
+#define dns_catz_attach_catzs(catzs, catzsp) \
+ dns_catz_zones__attach(catzs, catzsp, __func__, __FILE__, __LINE__)
+#define dns_catz_detach_catzs(catzsp) \
+ dns_catz_zones__detach(catzsp, __func__, __FILE__, __LINE__)
+#define dns_catz_ref_catzs(ptr) \
+ dns_catz_zones__ref(ptr, __func__, __FILE__, __LINE__)
+#define dns_catz_unref_catzs(ptr) \
+ dns_catz_zones__unref(ptr, __func__, __FILE__, __LINE__)
+
+ISC_REFCOUNT_TRACE_DECL(dns_catz_zone);
+ISC_REFCOUNT_TRACE_DECL(dns_catz_zones);
+#else
+/* Compatibility macros */
+#define dns_catz_attach_catz(catz, catzp) dns_catz_zone_attach(catz, catzp)
+#define dns_catz_detach_catz(catzp) dns_catz_zone_detach(catzp)
+#define dns_catz_ref_catz(ptr) dns_catz_zone_ref(ptr)
+#define dns_catz_unref_catz(ptr) dns_catz_zone_unref(ptr)
+
+#define dns_catz_attach_catzs(catzs, catzsp) \
+ dns_catz_zones_attach(catzs, catzsp)
+#define dns_catz_detach_catzs(catzsp) dns_catz_zones_detach(catzsp)
+#define dns_catz_ref_catzs(ptr) dns_catz_zones_ref(ptr)
+#define dns_catz_unref_catzs(ptr) dns_catz_zones_unref(ptr)
+
+ISC_REFCOUNT_DECL(dns_catz_zone);
+ISC_REFCOUNT_DECL(dns_catz_zones);
+#endif /* DNS_CATZ_TRACE */
+
ISC_LANG_ENDDECLS