diff --git a/include/heimqueue.h b/include/heimqueue.h index f54f7d7a2..5e922cfcb 100644 --- a/include/heimqueue.h +++ b/include/heimqueue.h @@ -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. */ diff --git a/lib/gssapi/mech/gss_utils.c b/lib/gssapi/mech/gss_utils.c index e622d8ff8..e12b3bd2f 100644 --- a/lib/gssapi/mech/gss_utils.c +++ b/lib/gssapi/mech/gss_utils.c @@ -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[];