mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-10 12:55:48 +01:00
gtype: Add GTypeFinalizable
An interface to allow GTypeInstances to control the memory management of their instance structure when they get freed by g_type_free_instance().
This commit is contained in:
parent
3c53fb8790
commit
90ad82d9b0
26
glib/gtype.c
26
glib/gtype.c
@ -1999,7 +1999,24 @@ g_type_free_instance (GTypeInstance *instance)
|
|||||||
NODE_NAME (node));
|
NODE_NAME (node));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (G_IS_TYPE_FINALIZABLE (instance))
|
||||||
|
{
|
||||||
|
GTypeFinalizableInterface *iface = G_TYPE_FINALIZABLE_GET_IFACE (instance);
|
||||||
|
GType parent_type = g_type_parent (class->g_type);
|
||||||
|
|
||||||
|
if (iface->finalize != NULL)
|
||||||
|
iface->finalize ((GTypeFinalizable *) instance);
|
||||||
|
|
||||||
|
iface = g_type_interface_peek_parent (iface);
|
||||||
|
while (iface != NULL)
|
||||||
|
{
|
||||||
|
if (iface->finalize != NULL)
|
||||||
|
iface->finalize ((GTypeFinalizable *) instance);
|
||||||
|
iface = g_type_interface_peek_parent (iface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
instance->g_class = NULL;
|
instance->g_class = NULL;
|
||||||
private_size = node->data->instance.private_size;
|
private_size = node->data->instance.private_size;
|
||||||
ivar_size = node->data->instance.instance_size;
|
ivar_size = node->data->instance.instance_size;
|
||||||
@ -4972,3 +4989,10 @@ g_type_init_internal (void)
|
|||||||
_g_value_transforms_init ();
|
_g_value_transforms_init ();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
g_type_finalizable_default_init (GTypeFinalizableInterface *iface)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
G_DEFINE_INTERFACE (GTypeFinalizable, g_type_finalizable, G_TYPE_INVALID)
|
||||||
|
48
glib/gtype.h
48
glib/gtype.h
@ -427,6 +427,8 @@ typedef struct _GInterfaceInfo GInterfaceInfo;
|
|||||||
typedef struct _GTypeValueTable GTypeValueTable;
|
typedef struct _GTypeValueTable GTypeValueTable;
|
||||||
typedef struct _GTypeQuery GTypeQuery;
|
typedef struct _GTypeQuery GTypeQuery;
|
||||||
|
|
||||||
|
typedef struct _GTypeFinalizable GTypeFinalizable;
|
||||||
|
typedef struct _GTypeFinalizableInterface GTypeFinalizableInterface;
|
||||||
|
|
||||||
/* Basic Type Structures
|
/* Basic Type Structures
|
||||||
*/
|
*/
|
||||||
@ -480,6 +482,34 @@ struct _GTypeQuery
|
|||||||
guint instance_size;
|
guint instance_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GTypeFinalizable:
|
||||||
|
*
|
||||||
|
* An interface for finalizable types.
|
||||||
|
*
|
||||||
|
* Instance types that allocate data on the instance structure and wish
|
||||||
|
* to free their resources when [func@GObject.type_free_instance] is called,
|
||||||
|
* should implement the [vfunc@GObject.TypeFinalizable.finalize] virtual
|
||||||
|
* function of this interface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GTypeFinalizableInterface:
|
||||||
|
*
|
||||||
|
* An interface for finalizable types.
|
||||||
|
*/
|
||||||
|
struct _GTypeFinalizableInterface
|
||||||
|
{
|
||||||
|
GTypeInterface parent_iface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GTypeFinalizableInterface::finalize:
|
||||||
|
* @self: the instance to finalize
|
||||||
|
*
|
||||||
|
* Finalizes the instance data.
|
||||||
|
*/
|
||||||
|
void (* finalize) (GTypeFinalizable *self);
|
||||||
|
};
|
||||||
|
|
||||||
/* Casts, checks and accessors for structured types
|
/* Casts, checks and accessors for structured types
|
||||||
* usage of these macros is reserved to type implementations only
|
* usage of these macros is reserved to type implementations only
|
||||||
@ -2718,4 +2748,22 @@ const gchar * g_type_name_from_class (GTypeClass *g_class);
|
|||||||
*/
|
*/
|
||||||
#define GTYPE_TO_POINTER(t) ((gpointer) (guintptr) (t)) GLIB_AVAILABLE_MACRO_IN_2_80
|
#define GTYPE_TO_POINTER(t) ((gpointer) (guintptr) (t)) GLIB_AVAILABLE_MACRO_IN_2_80
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_ALL
|
||||||
|
GType g_type_finalizable_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
G_GNUC_UNUSED static inline GTypeFinalizable *
|
||||||
|
G_TYPE_FINALIZABLE (gpointer ptr) {
|
||||||
|
return G_TYPE_CHECK_INSTANCE_CAST (ptr, g_type_finalizable_get_type (), GTypeFinalizable);
|
||||||
|
}
|
||||||
|
|
||||||
|
G_GNUC_UNUSED static inline gboolean
|
||||||
|
G_IS_TYPE_FINALIZABLE (gpointer ptr) {
|
||||||
|
return G_TYPE_CHECK_INSTANCE_TYPE (ptr, g_type_finalizable_get_type ());
|
||||||
|
}
|
||||||
|
|
||||||
|
G_GNUC_UNUSED static inline GTypeFinalizableInterface *
|
||||||
|
G_TYPE_FINALIZABLE_GET_IFACE (gpointer ptr) {
|
||||||
|
return G_TYPE_INSTANCE_GET_INTERFACE (ptr, g_type_finalizable_get_type (), GTypeFinalizableInterface);
|
||||||
|
}
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user