diff options
author | Neil Roberts <neil@linux.intel.com> | 2012-01-24 16:36:16 +0000 |
---|---|---|
committer | Neil Roberts <neil@linux.intel.com> | 2012-01-24 18:33:04 +0000 |
commit | 0a9cac84ae9c31e4b98fb0c066234f271ae742ad (patch) | |
tree | 6ddc3eb31f6f2da6b027b0950ceca232c870e299 | |
parent | 1224c2a15e57556c33caa376bff790148a97356e (diff) | |
download | cogl-0a9cac84ae9c31e4b98fb0c066234f271ae742ad.tar.gz |
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 override up to it.
-rw-r--r-- | cogl/cogl-object-private.h | 6 | ||||
-rw-r--r-- | cogl/cogl-object.c | 9 |
2 files changed, 14 insertions, 1 deletions
diff --git a/cogl/cogl-object-private.h b/cogl/cogl-object-private.h index d3355898..d7c3412b 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 7f06d8d2..4e0b4edf 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; @@ -98,6 +98,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) { cogl_object_unref (handle); |