}
}
-/*
- * Free a zone. Because we require that there be no more
- * outstanding events or references, no locking is necessary.
- */
-static void
-zone_free(dns_zone_t *zone) {
+void
+dns__zone_free(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
REQUIRE(!LOCKED_ZONE(zone));
REQUIRE(zone->timer == NULL);
return result;
}
-static bool
-exit_check(dns_zone_t *zone) {
+bool
+dns__zone_free_check(dns_zone_t *zone) {
REQUIRE(LOCKED_ZONE(zone));
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_SHUTDOWN) &&
if (isc_refcount_decrement(&zone->irefs) == 1) {
bool free_needed;
LOCK_ZONE(zone);
- free_needed = exit_check(zone);
+ free_needed = dns__zone_free_check(zone);
UNLOCK_ZONE(zone);
if (free_needed) {
- zone_free(zone);
+ dns__zone_free(zone);
}
}
}
return zone->mctx;
}
+isc_refcount_t *
+dns__zone_irefs(dns_zone_t *zone) {
+ REQUIRE(DNS_ZONE_VALID(zone));
+
+ return &zone->irefs;
+}
+
dns_zonemgr_t *
dns_zone_getmgr(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
}
/*
- * We have now canceled everything set the flag to allow exit_check()
- * to succeed. We must not unlock between setting this flag and
- * calling exit_check().
+ * We have now canceled everything set the flag to allow
+ * dns__zone_free_check() to succeed. We must not unlock between
+ * setting this flag and calling dns__zone_free_check().
*/
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_SHUTDOWN);
- free_needed = exit_check(zone);
+ free_needed = dns__zone_free_check(zone);
/*
* If a dump is in progress for the secure zone, defer detaching from
* the raw zone as it may prevent the unsigned serial number from being
dns_zone_idetach(&secure);
}
if (free_needed) {
- zone_free(zone);
+ dns__zone_free(zone);
}
}
free:
isc_mem_put(zone->mctx, data, sizeof(*data));
isc_refcount_decrement(&zone->irefs);
- free_needed = exit_check(zone);
+ free_needed = dns__zone_free_check(zone);
UNLOCK_ZONE(zone);
if (free_needed) {
- zone_free(zone);
+ dns__zone_free(zone);
}
}
}
isc_refcount_decrement(&zone->irefs);
- free_needed = exit_check(zone);
+ free_needed = dns__zone_free_check(zone);
UNLOCK_ZONE(zone);
if (free_needed) {
- zone_free(zone);
+ dns__zone_free(zone);
}
}
* not yet have a database. Prevent that by queueing the event
* up if zone->db is NULL. All events queued here are
* subsequently processed by receive_secure_db() if it ever gets
- * called or simply freed by zone_free() otherwise.
+ * called or simply freed by dns__zone_free() otherwise.
*/
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
/*! \file */
/*%
- * Types and functions below not be used outside this module and its
- * associated unit tests.
+ * Types and functions below meant to be used for internal zone
+ * modules only, and associated unit tests.
*/
#define UDP_REQUEST_TIMEOUT 5 /*%< 5 seconds */
*\li The caller is running in the context of the zone's loop.
*\li 'zonep' to point to a valid zone, already locked.
*/
+
+isc_refcount_t *
+dns__zone_irefs(dns_zone_t *zone);
+/*%<
+ * Get the reference count of a zone.
+ *
+ * Requires:
+ * \li 'zone' to be a valid zone.
+ */
+
+void
+dns__zone_free(dns_zone_t *zone);
+/*
+ * Free a zone. Because we require that there be no more
+ * outstanding events or references, no locking is necessary.
+ *
+ * Requires:
+ * \li 'zone' to be a valid zone, unlocked.
+ */
+
+bool
+dns__zone_free_check(dns_zone_t *zone);
+/*
+ * Check if a zone is ready to be freed.
+ *
+ * Requires:
+ * \li 'zone' to be a valid zone, locked.
+ */