#include <inttypes.h>
#include <stdbool.h>
+#include <isc/atomic.h>
#include <isc/file.h>
#include <isc/hex.h>
#include <isc/mutex.h>
int32_t journalsize;
dns_rdataclass_t rdclass;
dns_zonetype_t type;
- unsigned int flags;
- dns_zoneopt_t options;
+ atomic_uint_fast64_t flags;
+ atomic_uint_fast64_t options;
unsigned int db_argc;
char **db_argv;
isc_time_t expiretime;
isc_sockaddr_t *masters;
isc_dscp_t *masterdscps;
dns_name_t **masterkeynames;
- bool *mastersok;
+ bool *mastersok;
unsigned int masterscnt;
unsigned int curmaster;
isc_sockaddr_t masteraddr;
/*%
* Autosigning/key-maintenance options
*/
- uint32_t keyopts;
+ atomic_uint_fast64_t keyopts;
/*%
* True if added by "rndc addzone"
(_z)->offline = false; \
} while (0)
-#define DNS_ZONE_FLAG(z,f) ((z)->flags & (f))
-#define DNS_ZONE_SETFLAG(z,f) do { \
- INSIST(LOCKED_ZONE(z)); \
- (z)->flags |= (f); \
- } while (0)
-#define DNS_ZONE_CLRFLAG(z,f) do { \
- INSIST(LOCKED_ZONE(z)); \
- (z)->flags &= ~(f); \
- } while (0)
+#define DNS_ZONE_FLAG(z,f) ((atomic_load_relaxed(&(z)->flags) & (f)) != 0)
+#define DNS_ZONE_SETFLAG(z,f) atomic_fetch_or(&(z)->flags, (f))
+#define DNS_ZONE_CLRFLAG(z,f) atomic_fetch_and(&(z)->flags, ~(f))
/* XXX MPA these may need to go back into zone.h */
#define DNS_ZONEFLG_REFRESH 0x00000001U /*%< refresh check in progress */
#define DNS_ZONEFLG_NEEDDUMP 0x00000002U /*%< zone need consolidation */
* being loaded for the
* first time. */
-#define DNS_ZONE_OPTION(z,o) (((z)->options & (o)) != 0)
-#define DNS_ZONEKEY_OPTION(z,o) (((z)->keyopts & (o)) != 0)
+#define DNS_ZONE_OPTION(z,o) ((atomic_load_relaxed(&(z)->options) & (o)) != 0)
+#define DNS_ZONE_SETOPTION(z,o) atomic_fetch_or(&(z)->options, (o))
+#define DNS_ZONE_CLROPTION(z,o) atomic_fetch_and(&(z)->options, ~(o))
+
+#define DNS_ZONEKEY_OPTION(z,o) ((atomic_load_relaxed(&(z)->keyopts) & (o)) != 0)
+#define DNS_ZONEKEY_SETOPTION(z,o) atomic_fetch_or(&(z)->keyopts, (o))
+#define DNS_ZONEKEY_CLROPTION(z,o) atomic_fetch_and(&(z)->keyopts, ~(o))
/* Flags for zone_load() */
#define DNS_ZONELOADFLAG_NOSTAT 0x00000001U /* Do not stat() master files */
zone->journal = NULL;
zone->rdclass = dns_rdataclass_none;
zone->type = dns_zone_none;
- zone->flags = 0;
- zone->options = 0;
- zone->keyopts = 0;
+ atomic_init(&zone->flags, 0);
+ atomic_init(&zone->options, 0);
+ atomic_init(&zone->keyopts, 0);
zone->db_argc = 0;
zone->db_argv = NULL;
isc_time_settoepoch(&zone->expiretime);
REQUIRE(DNS_ZONE_VALID(zone));
LOCK_ZONE(zone);
- if (maxttl != 0)
- zone->options |= DNS_ZONEOPT_CHECKTTL;
- else
- zone->options &= ~DNS_ZONEOPT_CHECKTTL;
+ if (maxttl != 0) {
+ DNS_ZONE_SETOPTION(zone, DNS_ZONEOPT_CHECKTTL);
+ } else {
+ DNS_ZONE_CLROPTION(zone, DNS_ZONEOPT_CHECKTTL);
+ }
zone->maxttl = maxttl;
UNLOCK_ZONE(zone);
dns_zone_setflag(dns_zone_t *zone, unsigned int flags, bool value) {
REQUIRE(DNS_ZONE_VALID(zone));
- LOCK_ZONE(zone);
- if (value)
+ if (value) {
DNS_ZONE_SETFLAG(zone, flags);
- else
+ } else {
DNS_ZONE_CLRFLAG(zone, flags);
- UNLOCK_ZONE(zone);
+ }
}
void
{
REQUIRE(DNS_ZONE_VALID(zone));
- LOCK_ZONE(zone);
- if (value)
- zone->options |= option;
- else
- zone->options &= ~option;
- UNLOCK_ZONE(zone);
+ if (value) {
+ DNS_ZONE_SETOPTION(zone, option);
+ } else {
+ DNS_ZONE_CLROPTION(zone, option);
+ }
}
dns_zoneopt_t
dns_zone_getoptions(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
- return (zone->options);
+ return (atomic_load_relaxed(&zone->options));
}
void
{
REQUIRE(DNS_ZONE_VALID(zone));
- LOCK_ZONE(zone);
- if (value)
- zone->keyopts |= keyopt;
- else
- zone->keyopts &= ~keyopt;
- UNLOCK_ZONE(zone);
+ if (value) {
+ DNS_ZONEKEY_SETOPTION(zone, keyopt);
+ } else {
+ DNS_ZONEKEY_CLROPTION(zone, keyopt);
+ }
}
unsigned int
REQUIRE(DNS_ZONE_VALID(zone));
- return (zone->keyopts);
+ return (atomic_load_relaxed(&zone->keyopts));
}
isc_result_t
*/
LOCK_ZONE(zone);
- oldflags = zone->flags;
+ oldflags = atomic_load(&zone->flags);
if (zone->masterscnt == 0) {
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOMASTERS);
if ((oldflags & DNS_ZONEFLG_NOMASTERS) == 0)
}
}
- INSIST((zone->flags & DNS_ZONEFLG_REFRESH) != 0);
+ INSIST(DNS_ZONE_FLAG(zone, DNS_ZONEFLG_REFRESH));
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_SOABEFOREAXFR);
* Clear fullsign flag, if it was set, so we don't do
* another full signing next time
*/
- zone->keyopts &= ~DNS_ZONEKEY_FULLSIGN;
+ DNS_ZONEKEY_CLROPTION(zone, DNS_ZONEKEY_FULLSIGN);
/*
* Cause the zone to add/delete NSEC3 chains for the
if (zone->type == dns_zone_master && zone->task != NULL) {
LOCK_ZONE(zone);
- if (fullsign)
- zone->keyopts |= DNS_ZONEKEY_FULLSIGN;
+ if (fullsign) {
+ DNS_ZONEKEY_SETOPTION(zone, DNS_ZONEKEY_FULLSIGN);
+ }
TIME_NOW(&now);
zone->refreshkeytime = now;
}
bool
-dns_zone_isloaded(const dns_zone_t *zone) {
+dns_zone_isloaded(dns_zone_t *zone) {
REQUIRE(DNS_ZONE_VALID(zone));
return (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED));