Справочное описание GObject | ||||
---|---|---|---|---|
#include <glib-object.h>
GTypePlugin;
GTypePluginClass;
void (*GTypePluginUse) (GTypePlugin *plugin);
void (*GTypePluginUnuse) (GTypePlugin *plugin);
void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin,
GType g_type,
GTypeInfo *info,
GTypeValueTable *value_table);
void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
void g_type_plugin_use (GTypePlugin *plugin);
void g_type_plugin_unuse (GTypePlugin *plugin);
void g_type_plugin_complete_type_info (GTypePlugin *plugin,
GType g_type,
GTypeInfo *info,
GTypeValueTable *value_table);
void g_type_plugin_complete_interface_info
(GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
Система типов GObject поддерживает динамическую загрузку типов. Интерфейс GTypePlugin используется для обработки жизненного цикла динамически загружаемых типов. Это происходит следующим образом:
Сначала тип внедряется (обычно после загрузки модуля в первый раз, или вашим основным приложением,
которое знает какие модули внедряют какие типы), например:
new_type_id = g_type_register_dynamic (parent_type_id,
"TypeName",
new_type_plugin,
type_flags);
где new_type_plugin
это реализация интерфейса
GTypePlugin.
На реализованный тип создаётся ссылка, например через
g_type_class_ref()
или через
g_type_create_instance()
(вызывается функцией g_object_new()
)
или как описано выше выполняя наследование типа из new_type_id
.
Это заставит систему типов загрузить реализацию типа вызвав
g_type_plugin_use()
и
g_type_plugin_complete_type_info()
для
new_type_plugin
.
В некоторой точке реализация типа больше не требуется, например после
g_type_class_unref()
или
g_type_free_instance()
(вызывается когда количество ссылок экземпляра сброшено до нуля).
Это заставит систему типов сбросить информацию найденную с помощью
g_type_plugin_complete_type_info()
и зтем вызвать
g_type_plugin_unuse()
для
new_type_plugin
.
Цикл может повторятся от второго шага.
В основном вы должны реализовать GTypePlugin тип
который несёт use_count, как только use_count станет единицей, вы должны загрузить реализацию для успешной обработки наступающего вызова
g_type_plugin_complete_type_info()
.
Позже, возможно после последующих использованных/неиспользованных вызовов, как только use_count сброшен до 0, вы можете выгрузить реализацию
снова. Система типов гарантированно вызовет
g_type_plugin_use()
и
g_type_plugin_complete_type_info()
снова
когда тип потребуется опять.
GTypeModule это реализация GTypePlugin в которой уже реализованы большинство необходимого для фактической загрузки или выгрузки модуля. Это даже обрабатывает многократную регистрацию типов в модуле.
typedef struct _GTypePlugin GTypePlugin;
Декларация типа GTypePlugin используется как метка для объектов которые реализуют интерфейс GTypePlugin.
typedef struct {
GTypePluginUse use_plugin;
GTypePluginUnuse unuse_plugin;
GTypePluginCompleteTypeInfo complete_type_info;
GTypePluginCompleteInterfaceInfo complete_interface_info;
} GTypePluginClass;
Интерфейс GTypePlugin используется системой типов для обработки жизненного цикла динамически загружаемых типов.
GTypePluginUse use_plugin ; |
Увеличивает количество используемых plugin. |
GTypePluginUnuse unuse_plugin ; |
Уменьшает количество используемых plugin. |
GTypePluginCompleteTypeInfo complete_type_info ; |
Заполняет сструктуры GTypeInfo и
GTypeValueTable для типа.
Сструктуры инициализируются с помощью memset(s, 0, sizeof (s)) перед вызовом этой функции.
|
GTypePluginCompleteInterfaceInfo complete_interface_info ; |
Заполняет недостающие части GInterfaceInfo
для интерфейса. Сструктуры инициализируются с помощью memset(s, 0, sizeof (s)) перед вызовом этой
функции.
|
void (*GTypePluginUse) (GTypePlugin *plugin);
Тип use_plugin
функции
GTypePluginClass, которая вызывается для увеличения
используемого количества plugin
.
plugin : |
GTypePlugin чьё используемое количество должно быть увеличено |
void (*GTypePluginUnuse) (GTypePlugin *plugin);
Тип unuse_plugin
функции GTypePluginClass.
plugin : |
GTypePlugin чьё используемое количество должно быть уменьшено |
void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin,
GType g_type,
GTypeInfo *info,
GTypeValueTable *value_table);
Тип complete_type_info
функции GTypePluginClass.
plugin : |
GTypePlugin |
g_type : |
GType чья информация заполнена |
info : |
GTypeInfo структура для заполнения |
value_table : |
GTypeValueTable для заполнения |
void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
Тип complete_interface_info
функции GTypePluginClass.
plugin : |
GTypePlugin |
instance_type : |
GType инстанциируемого типа к которому добавляется интерфейс |
interface_type : |
GType интерфейса чья информация заполнена |
info : |
GInterfaceInfo для заполнения |
void g_type_plugin_use (GTypePlugin *plugin);
Вызывает use_plugin
функцию из
GTypePluginClass принадлежащей
plugin
.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
GTypePlugin |
void g_type_plugin_unuse (GTypePlugin *plugin);
Вызывает unuse_plugin
функцию из
GTypePluginClass принадлежащей
plugin
.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
a GTypePlugin |
void g_type_plugin_complete_type_info (GTypePlugin *plugin,
GType g_type,
GTypeInfo *info,
GTypeValueTable *value_table);
Вызывает complete_type_info
функцию из
GTypePluginClass принадлежащей
plugin
.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
GTypePlugin |
g_type : |
GType чья информация заполняется |
info : |
GTypeInfo структура для заполнения |
value_table : |
GTypeValueTable для заполнения |
void g_type_plugin_complete_interface_info
(GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
Вызывает complete_interface_info
функцию из
GTypePluginClass принадлежащей
plugin
.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
GTypePlugin |
instance_type : |
GType инстанциируемого типа к которому добавляется интерфейс |
interface_type : |
GType интерфейса чья информация заполняется |
info : |
GInterfaceInfo для заполнения |