gdataset: expose g_datalist_lock()/g_datalist_unlock() as private API

g_datalist_id_update_atomic() allows it to use the GData set lock, by
performing complex operations while holding the lock.

Expose the g_datalist_{lock,unlock}() functions as private API. That
will be useful, for further using the GData lock for the callers
purpose.
This commit is contained in:
Thomas Haller 2024-03-06 17:03:13 +01:00
parent 2545f318f8
commit df09ca7bcd
2 changed files with 22 additions and 10 deletions

View File

@ -151,27 +151,19 @@ static GDataset *g_dataset_cached = NULL; /* should this be
/* --- functions --- */ /* --- functions --- */
#define DATALIST_LOCK_BIT 2
G_ALWAYS_INLINE static inline GData * G_ALWAYS_INLINE static inline GData *
g_datalist_lock_and_get (GData **datalist) g_datalist_lock_and_get (GData **datalist)
{ {
guintptr ptr; guintptr ptr;
g_pointer_bit_lock_and_get ((void **) datalist, DATALIST_LOCK_BIT, &ptr); g_pointer_bit_lock_and_get ((void **) datalist, _G_DATALIST_LOCK_BIT, &ptr);
return G_DATALIST_CLEAN_POINTER (ptr); return G_DATALIST_CLEAN_POINTER (ptr);
} }
static void
g_datalist_unlock (GData **datalist)
{
g_pointer_bit_unlock ((void **)datalist, DATALIST_LOCK_BIT);
}
static void static void
g_datalist_unlock_and_set (GData **datalist, gpointer ptr) g_datalist_unlock_and_set (GData **datalist, gpointer ptr)
{ {
g_pointer_bit_unlock_and_set ((void **) datalist, DATALIST_LOCK_BIT, ptr, G_DATALIST_FLAGS_MASK_INTERNAL); g_pointer_bit_unlock_and_set ((void **) datalist, _G_DATALIST_LOCK_BIT, ptr, G_DATALIST_FLAGS_MASK_INTERNAL);
} }
static gsize static gsize

View File

@ -38,6 +38,26 @@ G_BEGIN_DECLS
#define G_DATALIST_GET_FLAGS(datalist) \ #define G_DATALIST_GET_FLAGS(datalist) \
((gsize) g_atomic_pointer_get (datalist) & G_DATALIST_FLAGS_MASK) ((gsize) g_atomic_pointer_get (datalist) & G_DATALIST_FLAGS_MASK)
#define _G_DATALIST_LOCK_BIT 2
#define g_datalist_lock(datalist) \
G_STMT_START \
{ \
GData **const _datalist = (datalist); \
\
g_pointer_bit_lock ((void **) _datalist, _G_DATALIST_LOCK_BIT); \
} \
G_STMT_END
#define g_datalist_unlock(datalist) \
G_STMT_START \
{ \
GData **const _datalist = (datalist); \
\
g_pointer_bit_unlock ((void **) _datalist, _G_DATALIST_LOCK_BIT); \
} \
G_STMT_END
/*< private > /*< private >
* GDataListUpdateAtomicFunc: * GDataListUpdateAtomicFunc:
* @data: (inout) (nullable) (not optional): the existing data corresponding * @data: (inout) (nullable) (not optional): the existing data corresponding