@@ -74,6 +74,8 @@ void _filterx_type_init_methods(FilterXType *type);
74
74
__VA_ARGS__ \
75
75
}
76
76
77
+ #define FILTERX_OBJECT_MAGIC_BIAS G_MAXINT32
78
+
77
79
78
80
FILTERX_DECLARE_TYPE (object );
79
81
@@ -100,14 +102,48 @@ FilterXObject *filterx_object_getattr_string(FilterXObject *self, const gchar *a
100
102
gboolean filterx_object_setattr_string (FilterXObject * self , const gchar * attr_name , FilterXObject * * new_value );
101
103
102
104
FilterXObject * filterx_object_new (FilterXType * type );
103
- FilterXObject * filterx_object_ref (FilterXObject * self );
104
- void filterx_object_unref (FilterXObject * self );
105
105
gboolean filterx_object_freeze (FilterXObject * self );
106
- gboolean filterx_object_is_frozen (FilterXObject * self );
107
106
void filterx_object_unfreeze_and_free (FilterXObject * self );
108
107
void filterx_object_init_instance (FilterXObject * self , FilterXType * type );
109
108
void filterx_object_free_method (FilterXObject * self );
110
109
110
+ static inline gboolean
111
+ filterx_object_is_frozen (FilterXObject * self )
112
+ {
113
+ return g_atomic_counter_get (& self -> ref_cnt ) == FILTERX_OBJECT_MAGIC_BIAS ;
114
+ }
115
+
116
+ static inline FilterXObject *
117
+ filterx_object_ref (FilterXObject * self )
118
+ {
119
+ if (!self )
120
+ return NULL ;
121
+
122
+ if (filterx_object_is_frozen (self ))
123
+ return self ;
124
+
125
+ g_atomic_counter_inc (& self -> ref_cnt );
126
+
127
+ return self ;
128
+ }
129
+
130
+ static inline void
131
+ filterx_object_unref (FilterXObject * self )
132
+ {
133
+ if (!self )
134
+ return ;
135
+
136
+ if (filterx_object_is_frozen (self ))
137
+ return ;
138
+
139
+ g_assert (g_atomic_counter_get (& self -> ref_cnt ) > 0 );
140
+ if (g_atomic_counter_dec_and_test (& self -> ref_cnt ))
141
+ {
142
+ self -> type -> free_fn (self );
143
+ g_free (self );
144
+ }
145
+ }
146
+
111
147
static inline void
112
148
filterx_object_make_readonly (FilterXObject * self )
113
149
{
0 commit comments