base: use heim_base_atomic_load in heimqueue.h

Use heim_base_atomic_load() rather than heim_base_exchange_pointer() when
iterating an atomic SLIST
This commit is contained in:
Luke Howard
2020-07-13 09:37:10 +10:00
parent 7e86a27c0c
commit 504d059580
2 changed files with 16 additions and 7 deletions

View File

@@ -100,16 +100,25 @@ struct { \
*/
#include "heimbase.h"
#define HEIM_SLIST_ATOMIC_HEAD(name, type) \
struct name { \
heim_base_atomic(struct type *) slh_first; /* first element */ \
}
#define HEIM_SLIST_ATOMIC_ENTRY(type) \
struct { \
heim_base_atomic(struct type *) sle_next; /* next element */ \
}
#define HEIM_SLIST_ATOMIC_INSERT_HEAD(head, elm, field) do { \
(elm)->field.sle_next = \
heim_base_exchange_pointer(&(head)->slh_first, (elm)); \
} while (/*CONSTCOND*/0)
#define HEIM_SLIST_ATOMIC_FOREACH(var, head, field) \
for ((void)heim_base_exchange_pointer(&(var), (head)->slh_first); \
(var) != NULL; \
(void)heim_base_exchange_pointer(&(var), (var)->field.sle_next))
#define HEIM_SLIST_ATOMIC_FOREACH(var, head, field) \
for ((var) = heim_base_atomic_load(&(head)->slh_first); \
(var) != NULL; \
(var) = heim_base_atomic_load(&(var)->field.sle_next))
/*
* Tail queue definitions.
*/

View File

@@ -60,11 +60,11 @@ _gss_free_oid(OM_uint32 *minor_status, gss_OID oid)
}
struct _gss_interned_oid {
HEIM_SLIST_ENTRY(_gss_interned_oid) gio_link;
HEIM_SLIST_ATOMIC_ENTRY(_gss_interned_oid) gio_link;
gss_OID_desc gio_oid;
};
static HEIM_SLIST_HEAD(_gss_interned_oid_list, _gss_interned_oid) interned_oids =
static HEIM_SLIST_ATOMIC_HEAD(_gss_interned_oid_list, _gss_interned_oid) interned_oids =
HEIM_SLIST_HEAD_INITIALIZER(interned_oids);
extern gss_OID _gss_ot_internal[];