blob: 88fc716e74d6a503fbc6a25d543e244b47918a86 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/* grefcount.h: Reference counting
*
* Copyright 2018 Emmanuele Bassi
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GREFCOUNT_H__
#define __GREFCOUNT_H__
#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif
#include <glib/gatomic.h>
#include <glib/gtypes.h>
G_BEGIN_DECLS
GLIB_AVAILABLE_IN_2_58
void g_ref_count_init (grefcount *rc);
GLIB_AVAILABLE_IN_2_58
void g_ref_count_inc (grefcount *rc);
GLIB_AVAILABLE_IN_2_58
gboolean g_ref_count_dec (grefcount *rc);
GLIB_AVAILABLE_IN_2_58
gboolean g_ref_count_compare (grefcount *rc,
gint val);
GLIB_AVAILABLE_IN_2_58
void g_atomic_ref_count_init (gatomicrefcount *arc);
GLIB_AVAILABLE_IN_2_58
void g_atomic_ref_count_inc (gatomicrefcount *arc);
GLIB_AVAILABLE_IN_2_58
gboolean g_atomic_ref_count_dec (gatomicrefcount *arc);
GLIB_AVAILABLE_IN_2_58
gboolean g_atomic_ref_count_compare (gatomicrefcount *arc,
gint val);
/* On GCC we can use __extension__ to inline the API without using
* ancillary functions; we only do this when disabling checks, as
* it disables warnings when saturating the reference counters
*/
#if defined(__GNUC__) && defined(G_DISABLE_CHECKS)
# define g_ref_count_init(rc) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (grefcount)); \
(void) (0 ? *(rc) ^ *(rc) : 1); \
*(rc) = -1; \
}))
# define g_ref_count_inc(rc) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (grefcount)); \
(void) (0 ? *(rc) ^ *(rc) : 1); \
if (*(rc) == G_MININT) ; else { \
*(rc) -= 1; \
} \
}))
# define g_ref_count_dec(rc) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (grefcount)); \
grefcount __rc = *(rc); \
__rc += 1; \
if (__rc == 0) ; else { \
*(rc) = __rc; \
} \
(gboolean) (__rc == 0); \
}))
# define g_ref_count_compare(rc,val) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (grefcount)); \
(void) (0 ? *(rc) ^ (val) : 1); \
(gboolean) (*(rc) == -(val)); \
}))
# define g_atomic_ref_count_init(rc) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (gatomicrefcount)); \
(void) (0 ? *(rc) ^ *(rc) : 1); \
*(rc) = 1; \
}))
# define g_atomic_ref_count_inc(rc) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (gatomicrefcount)); \
(void) (0 ? *(rc) ^ *(rc) : 1); \
(void) (g_atomic_int_get (rc) == G_MAXINT ? 0 : g_atomic_int_inc ((rc))); \
}))
# define g_atomic_ref_count_dec(rc) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (gatomicrefcount)); \
(void) (0 ? *(rc) ^ *(rc) : 1); \
g_atomic_int_dec_and_test ((rc)); \
}))
# define g_atomic_ref_count_compare(rc,val) \
(G_GNUC_EXTENSION ({ \
G_STATIC_ASSERT (sizeof *(rc) == sizeof (gatomicrefcount)); \
(void) (0 ? *(rc) ^ (val) : 1); \
(gboolean) (g_atomic_int_get (rc) == (val)); \
}))
#endif /* __GNUC__ && G_DISABLE_CHECKS */
G_END_DECLS
#endif /* __GREFCOUNT_H__ */
|