summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2012-01-24 16:36:16 +0000
committerNeil Roberts <neil@linux.intel.com>2012-01-24 18:33:04 +0000
commit0a9cac84ae9c31e4b98fb0c066234f271ae742ad (patch)
tree6ddc3eb31f6f2da6b027b0950ceca232c870e299
parent1224c2a15e57556c33caa376bff790148a97356e (diff)
downloadcogl-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.h6
-rw-r--r--cogl/cogl-object.c9
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);