GTypePlugin

GTypePlugin — Интерфейс для динамически загружаемых типов

Краткое описание

#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);

Иерархия объектов

GInterface +----GTypePlugin

Известные реализации

GTypePlugin реализует GTypeModule.

Описание

Система типов GObject поддерживает динамическую загрузку типов. Интерфейс GTypePlugin используется для обработки жизненного цикла динамически загружаемых типов. Это происходит следующим образом:

  1. Сначала тип внедряется (обычно после загрузки модуля в первый раз, или вашим основным приложением, которое знает какие модули внедряют какие типы), например: new_type_id = g_type_register_dynamic (parent_type_id, "TypeName", new_type_plugin, type_flags); где new_type_plugin это реализация интерфейса GTypePlugin.

  2. На реализованный тип создаётся ссылка, например через g_type_class_ref() или через g_type_create_instance() (вызывается функцией g_object_new()) или как описано выше выполняя наследование типа из new_type_id.

  3. Это заставит систему типов загрузить реализацию типа вызвав g_type_plugin_use() и g_type_plugin_complete_type_info() для new_type_plugin.

  4. В некоторой точке реализация типа больше не требуется, например после g_type_class_unref() или g_type_free_instance() (вызывается когда количество ссылок экземпляра сброшено до нуля).

  5. Это заставит систему типов сбросить информацию найденную с помощью g_type_plugin_complete_type_info() и зтем вызвать g_type_plugin_unuse() для new_type_plugin.

  6. Цикл может повторятся от второго шага.

В основном вы должны реализовать 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 в которой уже реализованы большинство необходимого для фактической загрузки или выгрузки модуля. Это даже обрабатывает многократную регистрацию типов в модуле.

Детали

GTypePlugin

typedef struct _GTypePlugin GTypePlugin;

Декларация типа GTypePlugin используется как метка для объектов которые реализуют интерфейс GTypePlugin.


GTypePluginClass

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)) перед вызовом этой функции.

GTypePluginUse ()

void (*GTypePluginUse) (GTypePlugin *plugin);

Тип use_plugin функции GTypePluginClass, которая вызывается для увеличения используемого количества plugin.

plugin : GTypePlugin чьё используемое количество должно быть увеличено

GTypePluginUnuse ()

void (*GTypePluginUnuse) (GTypePlugin *plugin);

Тип unuse_plugin функции GTypePluginClass.

plugin : GTypePlugin чьё используемое количество должно быть уменьшено

GTypePluginCompleteTypeInfo ()

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 для заполнения

GTypePluginCompleteInterfaceInfo ()

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 для заполнения

g_type_plugin_use ()

void g_type_plugin_use (GTypePlugin *plugin);

Вызывает use_plugin функцию из GTypePluginClass принадлежащей plugin. Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.

plugin : GTypePlugin

g_type_plugin_unuse ()

void g_type_plugin_unuse (GTypePlugin *plugin);

Вызывает unuse_plugin функцию из GTypePluginClass принадлежащей plugin. Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.

plugin : a GTypePlugin

g_type_plugin_complete_type_info ()

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 для заполнения

g_type_plugin_complete_interface_info ()

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 для заполнения

Смотрите также

GTypeModule и g_type_register_dynamic().