GTypeModule

GTypeModule — Тип загружаемых модулей

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

#include <glib-object.h> GTypeModule; GTypeModuleClass; gboolean g_type_module_use (GTypeModule *module); void g_type_module_unuse (GTypeModule *module); void g_type_module_set_name (GTypeModule *module, const gchar *name); GType g_type_module_register_type (GTypeModule *module, GType parent_type, const gchar *type_name, const GTypeInfo *type_info, GTypeFlags flags); void g_type_module_add_interface (GTypeModule *module, GType instance_type, GType interface_type, const GInterfaceInfo *interface_info); GType g_type_module_register_enum (GTypeModule *module, const gchar *name, const GEnumValue *const _static_values); GType g_type_module_register_flags (GTypeModule *module, const gchar *name, const GFlagsValue *const _static_values); #define G_DEFINE_DYNAMIC_TYPE (TN, t_n, T_P) #define G_DEFINE_DYNAMIC_TYPE_EXTENDED (TypeName, type_name, TYPE_PARENT, flags, CODE)

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

GObject +----GTypeModule

Реализуемые интерфейсы

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

Описание

GTypeModule обеспечивает простую реализацию интерфейса GTypePlugin. Моделью GTypeModule является динамически загружаемый модуль который реализует некоторое количество реализаций типов и интерфейсов. Когда модуль загружен, происходит регистрация его типов и интерфейсов используя g_type_module_register_type() и g_type_module_add_interface(). Пока экземпляры этих типов и интерфейсов используются, модуль остаётся загруженным. Когда типы и интерфейсы больше не нужны, модуль может быть выгружен. Если типы и интерфейсы потребовались снова, модуль перезагружается. Помните что последний сброс ссылки не может произойти в коде модуля, так как это привело бы к выгрузке кода вызываемой программой прежде чем g_object_unref() вернёт значение.

Отслеживание загружен модуль или нет выполняется счётчиком использования - начиная с нуля, всегда когда счётчик больше нуля, модуль загружен. Счётчик использования внутренне поддерживается системой типов, но так же может явно контролироваться с помощью g_type_module_use() и g_type_module_unuse(). Обычно когда загружается модуль для первого типа, g_type_module_use() будет использована чтобы при загрузке могли инициализироваться его типы. Немного позже, когда модуль больше не должен быть загружен кроме как для реализации типа который содержит, вызывается g_type_module_unuse().

GTypeModule фактически не обеспечивает ни загрузки ни выгрузки модуля. Для создания специфичного модуля вы должны унаследовать GTypeModule и реализовать загрузку и выгрузку функций в GTypeModuleClass.

Детали

GTypeModule

typedef struct { gchar *name; } GTypeModule;

Члены сструктуры GTypeModule не имеют непосредственного доступа, исключая поле name.

gchar *name; имя модуля

GTypeModuleClass

typedef struct { GObjectClass parent_class; gboolean (* load) (GTypeModule *module); void (* unload) (GTypeModule *module); } GTypeModuleClass;

Для осуществления динамической загрузки типов основанных на GTypeModule, функции load и unload должны быть реализованы в GTypeModuleClass.

GObjectClass parent_class; родительский класс
load () загружает модуль и регистрирует один тип или больше используя g_type_module_register_type().
unload () выгружает модуль

g_type_module_use ()

gboolean g_type_module_use (GTypeModule *module);

Увеличивает количество использований GTypeModule на единицу. Если количество использований перед этим было 0, модуль будет загружен.

module : GTypeModule
Возвращает : FALSE если необходимая загрузка модуля неудалась.

g_type_module_unuse ()

void g_type_module_unuse (GTypeModule *module);

Уменьшает количество использований GTypeModule на единицу. Если результатом уменьшения будет 0, модуль выгружается. (Однако, GTypeModule не будет освобождена, а регистрация типов связанных с GTypeModule не отменяется. Как только GTypeModule инициализирована, она будет существовать всегда).

module : GTypeModule

g_type_module_set_name ()

void g_type_module_set_name (GTypeModule *module, const gchar *name);

Устанавливает имя для GTypeModule

module : GTypeModule.
name : Удобное для чтения имя используемое в сообщениях об ошибках.

g_type_module_register_type ()

GType g_type_module_register_type (GTypeModule *module, GType parent_type, const gchar *type_name, const GTypeInfo *type_info, GTypeFlags flags);

Находит или регистрирует тип который реализуется специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентифицирующий тип, иначе тип вновь регистрируется и возвращается результирующий GType идентификатор.

Когда перерегистрируется тип (обычно потому что модуль выгружен а зтем загружен снова, и переинициализирован), module и parent_type должны быть такими же как предыдущие.

Пока любые экземпляры типа существуют, модуль типа не будет выгружен.

module : GTypeModule
parent_type : тип для родительского класса
type_name : имя для типа
type_info : структура типовой информации
flags : поле флажков обеспечивающих детали о типе
Возвращает : новый или существующий ID типа

g_type_module_add_interface ()

void g_type_module_add_interface (GTypeModule *module, GType instance_type, GType interface_type, const GInterfaceInfo *interface_info);

Регистрирует дополнительный интерфейс для типа, у которого уже есть интерфейс в данном типовом модуле. Если интерфейс уже был зарегистрирован для типа в данном модуле, ничего не происходит.

Пока существуют любые интерфейсы типа, типовой модуль не будет выгружен.

module : GTypeModule
instance_type : тип к которому добавляется интерфейс.
interface_type : интерфейсный тип для добавления
interface_info : структура типовой информации

g_type_module_register_enum ()

GType g_type_module_register_enum (GTypeModule *module, const gchar *name, const GEnumValue *const _static_values);

находит или регистрирует перечисление которое реализуется с помощью специфичного типового модуля. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентификатор для типа, иначе тип вновь регистрируется и возвращается результирующий GType идентификатор.

Пока существуют любые экземпляры типа, типовой модуль не выгружается.

module : GTypeModule
name : имя для типа
_static_values :
Возвращает : новый или существующий ID типа

Начиная с версии 2.6


g_type_module_register_flags ()

GType g_type_module_register_flags (GTypeModule *module, const gchar *name, const GFlagsValue *const _static_values);

Находит или регистрирует флаги типа который реализован специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентификатор типа, иначе тип вновь регистрируется и возвращается GType идентификатор.

Пока существует любой экземпляр типа, модуль не будет выгружен.

module : GTypeModule
name : имя для типа
_static_values :
Возвращает : новый или существующий ID типа

Начиная с версии 2.6


G_DEFINE_DYNAMIC_TYPE()

#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P) G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})

Удобный макрос для динамической реализации типа, который объявляет функцию инициализации класса, функцию инициализации экземпляра (смотрите GTypeInfo для информации об этом) и статичную переменную с именем t_n_parent_class указывающим на родительский класс. Кроме того, он определяет *_get_type() и статичную функцию *_register_type() для использования в вашей module_init(). Смотрите G_DEFINE_DYNAMIC_TYPE_EXTENDED() для примера.

TN : Имя нового типа, в стиле CamelCase.
t_n : Имя нового типа, в нижнем регистре со словами разделёнными символом '_'.
T_P : GType родительского типа.

Начиная с версии 2.14


G_DEFINE_DYNAMIC_TYPE_EXTENDED()

#define G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE)

Более общая версия G_DEFINE_DYNAMIC_TYPE() которая позволяет определять GTypeFlags и произвольный код.

G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget, gtk_gadget, GTK_TYPE_THING, 0, G_IMPLEMENT_INTERFACE (TYPE_GIZMO, gtk_gadget_gizmo_init)); разворачивается до static void gtk_gadget_init (GtkGadget *self); static void gtk_gadget_class_init (GtkGadgetClass *klass); static void gtk_gadget_class_finalize (GtkGadgetClass *klass); static gpointer gtk_gadget_parent_class = NULL; static GType gtk_gadget_type_id = 0; static void gtk_gadget_class_intern_init (gpointer klass) { gtk_gadget_parent_class = g_type_class_peek_parent (klass); gtk_gadget_class_init ((GtkGadgetClass*) klass); } GType gtk_gadget_get_type (void) { return gtk_gadget_type_id; } static void gtk_gadget_register_type (GTypeModule *type_module) { const GTypeInfo g_define_type_info = { sizeof (GtkGadgetClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gtk_gadget_class_intern_init, (GClassFinalizeFunc) gtk_gadget_class_finalize, NULL, /* class_data */ sizeof (GtkGadget), 0, /* n_preallocs */ (GInstanceInitFunc) gtk_gadget_init, NULL /* value_table */ }; gtk_gadget_type_id = g_type_module_register_type (type_module, GTK_TYPE_THING, GtkGadget, &g_define_type_info, (GTypeFlags) flags); { const GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc) gtk_gadget_gizmo_init }; g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info); } }
TypeName : Имя нового типа, в стиле CamelCase.
type_name : Имя нового типа в нижнем регистре, со словами разделёнными символом '_'.
TYPE_PARENT : GType родительского типа.
flags : GTypeFlags помещаемые в g_type_register_static()
CODE : Произвольный код вставляемый в функцию *_get_type().

Начиная с версии 2.14

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

GTypePlugin

Интерфейс загрузчика абстрактного типа.

GModule

Портируемый механизм для динамической загрузки модулей.