@@ -39,32 +39,36 @@ static unsigned int magicCounter = 0xCAFE0000;
39
39
struct _virClass {
40
40
virClassPtr parent ;
41
41
42
+ GType type ;
42
43
unsigned int magic ;
43
44
char * name ;
44
45
size_t objectSize ;
45
46
46
47
virObjectDisposeCallback dispose ;
47
48
};
48
49
49
- #define VIR_OBJECT_NOTVALID (obj ) (!obj || ((obj->u.s.magic & 0xFFFF0000) != 0xCAFE0000))
50
+ typedef struct _virObjectPrivate virObjectPrivate ;
51
+ struct _virObjectPrivate {
52
+ virClassPtr klass ;
53
+ };
54
+
55
+
56
+ G_DEFINE_TYPE_WITH_PRIVATE (virObject , vir_object , G_TYPE_OBJECT )
57
+
58
+ #define VIR_OBJECT_NOTVALID (obj ) (!obj || !VIR_IS_OBJECT(obj))
50
59
51
60
#define VIR_OBJECT_USAGE_PRINT_WARNING (anyobj , objclass ) \
52
61
do { \
53
62
virObjectPtr obj = anyobj; \
54
- if (VIR_OBJECT_NOTVALID(obj)) { \
55
- if (!obj) \
56
- VIR_WARN("Object cannot be NULL"); \
57
- else \
58
- VIR_WARN("Object %p has a bad magic number %X", \
59
- obj, obj->u.s.magic); \
60
- } else { \
63
+ if (!obj) \
64
+ VIR_WARN("Object cannot be NULL"); \
65
+ if (VIR_OBJECT_NOTVALID(obj)) \
61
66
VIR_WARN("Object %p (%s) is not a %s instance", \
62
- anyobj, obj->klass->name, #objclass); \
63
- } \
67
+ anyobj, g_type_name_from_instance((void*)anyobj), #objclass); \
64
68
} while (0)
65
69
66
70
67
- static virClassPtr virObjectClass ;
71
+ static virClassPtr virObjectClassImpl ;
68
72
static virClassPtr virObjectLockableClass ;
69
73
static virClassPtr virObjectRWLockableClass ;
70
74
@@ -74,17 +78,17 @@ static void virObjectRWLockableDispose(void *anyobj);
74
78
static int
75
79
virObjectOnceInit (void )
76
80
{
77
- if (!(virObjectClass = virClassNew (NULL ,
78
- "virObject" ,
79
- sizeof (virObject ),
80
- 0 ,
81
- NULL )))
81
+ if (!(virObjectClassImpl = virClassNew (NULL ,
82
+ "virObject" ,
83
+ sizeof (virObject ),
84
+ 0 ,
85
+ NULL )))
82
86
return -1 ;
83
87
84
- if (!VIR_CLASS_NEW (virObjectLockable , virObjectClass ))
88
+ if (!VIR_CLASS_NEW (virObjectLockable , virObjectClassImpl ))
85
89
return -1 ;
86
90
87
- if (!VIR_CLASS_NEW (virObjectRWLockable , virObjectClass ))
91
+ if (!VIR_CLASS_NEW (virObjectRWLockable , virObjectClassImpl ))
88
92
return -1 ;
89
93
90
94
return 0 ;
@@ -104,7 +108,7 @@ virClassForObject(void)
104
108
if (virObjectInitialize () < 0 )
105
109
return NULL ;
106
110
107
- return virObjectClass ;
111
+ return virObjectClassImpl ;
108
112
}
109
113
110
114
@@ -138,6 +142,14 @@ virClassForObjectRWLockable(void)
138
142
}
139
143
140
144
145
+ static void virClassDummyInit (void * klass G_GNUC_UNUSED )
146
+ {
147
+ }
148
+
149
+ static void virObjectDummyInit (void * obj G_GNUC_UNUSED )
150
+ {
151
+ }
152
+
141
153
/**
142
154
* virClassNew:
143
155
* @parent: the parent class
@@ -177,25 +189,26 @@ virClassNew(virClassPtr parent,
177
189
return NULL ;
178
190
}
179
191
180
- if (VIR_ALLOC (klass ) < 0 )
181
- goto error ;
182
-
192
+ klass = g_new0 (virClass , 1 );
183
193
klass -> parent = parent ;
184
194
klass -> magic = g_atomic_int_add (& magicCounter , 1 );
185
- if (klass -> magic > 0xCAFEFFFF ) {
186
- virReportError (VIR_ERR_INTERNAL_ERROR , "%s" ,
187
- _ ("too many object classes defined" ));
188
- goto error ;
189
- }
190
195
klass -> name = g_strdup (name );
191
196
klass -> objectSize = objectSize ;
197
+ if (parent == NULL ) {
198
+ klass -> type = vir_object_get_type ();
199
+ } else {
200
+ klass -> type =
201
+ g_type_register_static_simple (parent -> type ,
202
+ name ,
203
+ sizeof (virObjectClass ),
204
+ (GClassInitFunc )virClassDummyInit ,
205
+ objectSize ,
206
+ (GInstanceInitFunc )virObjectDummyInit ,
207
+ 0 );
208
+ }
192
209
klass -> dispose = dispose ;
193
210
194
211
return klass ;
195
-
196
- error :
197
- VIR_FREE (klass );
198
- return NULL ;
199
212
}
200
213
201
214
@@ -237,17 +250,13 @@ void *
237
250
virObjectNew (virClassPtr klass )
238
251
{
239
252
virObjectPtr obj = NULL ;
253
+ virObjectPrivate * priv ;
240
254
241
- if (VIR_ALLOC_VAR (obj ,
242
- char ,
243
- klass -> objectSize - sizeof (virObject )) < 0 )
244
- return NULL ;
245
-
246
- obj -> u .s .magic = klass -> magic ;
247
- obj -> klass = klass ;
248
- g_atomic_int_set (& obj -> u .s .refs , 1 );
255
+ obj = g_object_new (klass -> type , NULL );
249
256
250
- PROBE (OBJECT_NEW , "obj=%p classname=%s" , obj , obj -> klass -> name );
257
+ priv = vir_object_get_instance_private (obj );
258
+ priv -> klass = klass ;
259
+ PROBE (OBJECT_NEW , "obj=%p classname=%s" , obj , priv -> klass -> name );
251
260
252
261
return obj ;
253
262
}
@@ -304,6 +313,33 @@ virObjectRWLockableNew(virClassPtr klass)
304
313
return obj ;
305
314
}
306
315
316
+ static void vir_object_finalize (GObject * gobj )
317
+ {
318
+ PROBE (OBJECT_DISPOSE , "obj=%p" , gobj );
319
+ virObjectPtr obj = VIR_OBJECT (gobj );
320
+ virObjectPrivate * priv = vir_object_get_instance_private (obj );
321
+
322
+ virClassPtr klass = priv -> klass ;
323
+ while (klass ) {
324
+ if (klass -> dispose )
325
+ klass -> dispose (obj );
326
+ klass = klass -> parent ;
327
+ }
328
+
329
+ G_OBJECT_CLASS (vir_object_parent_class )-> finalize (gobj );
330
+ }
331
+
332
+ static void vir_object_init (virObject * obj G_GNUC_UNUSED )
333
+ {
334
+ }
335
+
336
+
337
+ static void vir_object_class_init (virObjectClass * klass )
338
+ {
339
+ GObjectClass * obj = G_OBJECT_CLASS (klass );
340
+
341
+ obj -> finalize = vir_object_finalize ;
342
+ }
307
343
308
344
static void
309
345
virObjectLockableDispose (void * anyobj )
@@ -340,23 +376,8 @@ virObjectUnref(void *anyobj)
340
376
if (VIR_OBJECT_NOTVALID (obj ))
341
377
return ;
342
378
343
- bool lastRef = !! g_atomic_int_dec_and_test ( & obj -> u . s . refs );
379
+ g_object_unref ( anyobj );
344
380
PROBE (OBJECT_UNREF , "obj=%p" , obj );
345
- if (lastRef ) {
346
- PROBE (OBJECT_DISPOSE , "obj=%p" , obj );
347
- virClassPtr klass = obj -> klass ;
348
- while (klass ) {
349
- if (klass -> dispose )
350
- klass -> dispose (obj );
351
- klass = klass -> parent ;
352
- }
353
-
354
- /* Clear & poison object */
355
- memset (obj , 0 , obj -> klass -> objectSize );
356
- obj -> u .s .magic = 0xDEADBEEF ;
357
- obj -> klass = (void * )0xDEADBEEF ;
358
- VIR_FREE (obj );
359
- }
360
381
}
361
382
362
383
@@ -376,7 +397,8 @@ virObjectRef(void *anyobj)
376
397
377
398
if (VIR_OBJECT_NOTVALID (obj ))
378
399
return NULL ;
379
- g_atomic_int_add (& obj -> u .s .refs , 1 );
400
+
401
+ g_object_ref (obj );
380
402
PROBE (OBJECT_REF , "obj=%p" , obj );
381
403
return anyobj ;
382
404
}
@@ -539,10 +561,13 @@ virObjectIsClass(void *anyobj,
539
561
virClassPtr klass )
540
562
{
541
563
virObjectPtr obj = anyobj ;
564
+ virObjectPrivate * priv ;
565
+
542
566
if (VIR_OBJECT_NOTVALID (obj ))
543
567
return false;
544
568
545
- return virClassIsDerivedFrom (obj -> klass , klass );
569
+ priv = vir_object_get_instance_private (obj );
570
+ return virClassIsDerivedFrom (priv -> klass , klass );
546
571
}
547
572
548
573
0 commit comments