#include <inttypes.h>
#include <stdbool.h>
+#include <isc/atomic.h>
#include <isc/crc64.h>
#include <isc/event.h>
#include <isc/heap.h>
* this rdataset.
*/
- uint32_t count;
+ atomic_uint_fast32_t count;
/*%<
* Monotonously increased every time this rdataset is bound so that
* it is used as the base of the starting point in DNS responses
- * when the "cyclic" rrset-order is required. Since the ordering
- * should not be so crucial, no lock is set for the counter for
- * performance reasons.
+ * when the "cyclic" rrset-order is required.
*/
dns_rbtnode_t *node;
rdataset->private2 = node;
raw = (unsigned char *)header + sizeof(*header);
rdataset->private3 = raw;
- rdataset->count = header->count++;
+ rdataset->count = atomic_fetch_add_relaxed(&header->count, 1);
if (rdataset->count == UINT32_MAX)
rdataset->count = 0;
newheader->attributes |= RDATASET_ATTR_ZEROTTL;
newheader->noqname = NULL;
newheader->closest = NULL;
- newheader->count = atomic_fetch_add(&init_count, 1);
+ atomic_init(&newheader->count,
+ atomic_fetch_add_relaxed(&init_count, 1));
newheader->trust = rdataset->trust;
newheader->last_used = now;
newheader->node = rbtnode;
newheader->trust = 0;
newheader->noqname = NULL;
newheader->closest = NULL;
- newheader->count = atomic_fetch_add(&init_count, 1);
+ atomic_init(&newheader->count,
+ atomic_fetch_add_relaxed(&init_count, 1));
newheader->last_used = 0;
newheader->node = rbtnode;
if ((rdataset->attributes & DNS_RDATASETATTR_RESIGN) != 0) {
newheader->serial = rbtversion->serial;
newheader->noqname = NULL;
newheader->closest = NULL;
- newheader->count = 0;
+ atomic_init(&newheader->count, 0);
newheader->node = rbtnode;
newheader->resign = 0;
newheader->resign_lsb = 0;
newheader->serial = rbtversion->serial;
else
newheader->serial = 0;
- newheader->count = 0;
+ atomic_init(&newheader->count, 0);
newheader->last_used = 0;
newheader->node = rbtnode;
newheader->serial = 1;
newheader->noqname = NULL;
newheader->closest = NULL;
- newheader->count = atomic_fetch_add(&init_count, 1);
+ atomic_init(&newheader->count,
+ atomic_fetch_add_relaxed(&init_count, 1));
newheader->last_used = 0;
newheader->node = node;
setownercase(newheader, name);