From 688a3e196bbe8a4ceb522ec819e8debc980fc6ad Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Tue, 24 Jan 2012 16:36:16 +0000 Subject: [PATCH] object: Add a virtual pointer for the unref function The virtual function gets called in cogl_object_unref. Any definition of a CoglObject type can replace the default unref function by using COGL_OBJECT_DEFINE_WITH_CODE to directly manipulate the CoglObjectClass struct. The generated object constructors set the pointer to the default implementation. The default implementation is exported in the private header so that any overriding implementations can chain up to it. Reviewed-by: Robert Bragg --- cogl/cogl-object-private.h | 6 ++++++ cogl/cogl-object.c | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cogl/cogl-object-private.h b/cogl/cogl-object-private.h index d33558986..d7c3412b5 100644 --- a/cogl/cogl-object-private.h +++ b/cogl/cogl-object-private.h @@ -53,6 +53,7 @@ typedef struct _CoglObjectClass { const char *name; void *virt_free; + void *virt_unref; } CoglObjectClass; #define COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES 2 @@ -167,6 +168,8 @@ _cogl_##type_name##_object_new (Cogl##TypeName *new_obj) \ \ obj->klass->virt_free = \ _cogl_object_##type_name##_indirect_free; \ + obj->klass->virt_unref = \ + _cogl_object_default_unref; \ obj->klass->name = "Cogl"#TypeName, \ \ g_hash_table_insert (_cogl_debug_instances, \ @@ -287,5 +290,8 @@ _cogl_object_set_user_data (CoglObject *object, void *user_data, CoglUserDataDestroyInternalCallback destroy); +void +_cogl_object_default_unref (void *obj); + #endif /* __COGL_OBJECT_PRIVATE_H */ diff --git a/cogl/cogl-object.c b/cogl/cogl-object.c index 7f06d8d29..4e0b4edf7 100644 --- a/cogl/cogl-object.c +++ b/cogl/cogl-object.c @@ -52,7 +52,7 @@ cogl_handle_ref (CoglHandle handle) } void -cogl_object_unref (void *object) +_cogl_object_default_unref (void *object) { CoglObject *obj = object; @@ -97,6 +97,13 @@ cogl_object_unref (void *object) } } +void +cogl_object_unref (void *obj) +{ + void (* unref_func) (void *) = ((CoglObject *) obj)->klass->virt_unref; + unref_func (obj); +} + void cogl_handle_unref (CoglHandle handle) {