Add init macros for refcounting types

We need a way to initialise refcounted types placed in static storage,
or on the stack. Using proper macros avoids knowing the magic constant
used for grefcount and gatomicrefcount.
This commit is contained in:
Emmanuele Bassi 2023-04-06 11:45:41 +01:00 committed by Philip Withnall
parent 28b1b9d9c3
commit e2e93056f2
2 changed files with 56 additions and 0 deletions

View File

@ -3689,12 +3689,14 @@ g_ref_count_init
g_ref_count_inc g_ref_count_inc
g_ref_count_dec g_ref_count_dec
g_ref_count_compare g_ref_count_compare
G_REF_COUNT_INIT
<SUBSECTION> <SUBSECTION>
gatomicrefcount gatomicrefcount
g_atomic_ref_count_init g_atomic_ref_count_init
g_atomic_ref_count_inc g_atomic_ref_count_inc
g_atomic_ref_count_dec g_atomic_ref_count_dec
g_atomic_ref_count_compare g_atomic_ref_count_compare
G_ATOMIC_REF_COUNT_INIT
</SECTION> </SECTION>
<SECTION> <SECTION>

View File

@ -50,6 +50,60 @@ GLIB_AVAILABLE_IN_2_58
gboolean g_atomic_ref_count_compare (gatomicrefcount *arc, gboolean g_atomic_ref_count_compare (gatomicrefcount *arc,
gint val); gint val);
/**
* G_REF_COUNT_INIT:
*
* Evaluates to the initial reference count for `grefcount`.
*
* This macro is useful for initializing `grefcount` fields inside
* structures, for instance:
*
* |[<!-- language="C" -->
* typedef struct {
* grefcount ref_count;
* char *name;
* char *address;
* } Person;
*
* static const Person default_person = {
* .ref_count = G_REF_COUNT_INIT,
* .name = "Default name",
* .address = "Default address",
* };
* ]|
*
* Since: 2.78
*/
#define G_REF_COUNT_INIT -1 \
GLIB_AVAILABLE_MACRO_IN_2_78
/**
* G_ATOMIC_REF_COUNT_INIT:
*
* Evaluates to the initial reference count for `gatomicrefcount`.
*
* This macro is useful for initializing `gatomicrefcount` fields inside
* structures, for instance:
*
* |[<!-- language="C" -->
* typedef struct {
* gatomicrefcount ref_count;
* char *name;
* char *address;
* } Person;
*
* static const Person default_person = {
* .ref_count = G_ATOMIC_REF_COUNT_INIT,
* .name = "Default name",
* .address = "Default address",
* };
* ]|
*
* Since: 2.78
*/
#define G_ATOMIC_REF_COUNT_INIT 1 \
GLIB_AVAILABLE_MACRO_IN_2_78
/* On GCC we can use __extension__ to inline the API without using /* On GCC we can use __extension__ to inline the API without using
* ancillary functions; we only do this when disabling checks, as * ancillary functions; we only do this when disabling checks, as
* it disables warnings when saturating the reference counters * it disables warnings when saturating the reference counters