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 <robert@linux.intel.com>
This commit is contained in:
Neil Roberts 2012-01-24 16:36:16 +00:00
parent 139421de19
commit 688a3e196b
2 changed files with 14 additions and 1 deletions

View File

@ -53,6 +53,7 @@ typedef struct _CoglObjectClass
{ {
const char *name; const char *name;
void *virt_free; void *virt_free;
void *virt_unref;
} CoglObjectClass; } CoglObjectClass;
#define COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES 2 #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 = \ obj->klass->virt_free = \
_cogl_object_##type_name##_indirect_free; \ _cogl_object_##type_name##_indirect_free; \
obj->klass->virt_unref = \
_cogl_object_default_unref; \
obj->klass->name = "Cogl"#TypeName, \ obj->klass->name = "Cogl"#TypeName, \
\ \
g_hash_table_insert (_cogl_debug_instances, \ g_hash_table_insert (_cogl_debug_instances, \
@ -287,5 +290,8 @@ _cogl_object_set_user_data (CoglObject *object,
void *user_data, void *user_data,
CoglUserDataDestroyInternalCallback destroy); CoglUserDataDestroyInternalCallback destroy);
void
_cogl_object_default_unref (void *obj);
#endif /* __COGL_OBJECT_PRIVATE_H */ #endif /* __COGL_OBJECT_PRIVATE_H */

View File

@ -52,7 +52,7 @@ cogl_handle_ref (CoglHandle handle)
} }
void void
cogl_object_unref (void *object) _cogl_object_default_unref (void *object)
{ {
CoglObject *obj = 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 void
cogl_handle_unref (CoglHandle handle) cogl_handle_unref (CoglHandle handle)
{ {