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)
Иерархия объектов
Реализуемые интерфейсы
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
Члены сструктуры GTypeModule не имеют непосредственного доступа, исключая поле name.
gchar *name;
имя модуля
GTypeModuleClass
Для осуществления динамической загрузки типов основанных на GTypeModule, функции load и unload должны быть реализованы в GTypeModuleClass.
GObjectClass parent_class;
родительский класс
load ()
загружает модуль и регистрирует один тип или больше используя g_type_module_register_type().
unload ()
выгружает модуль
g_type_module_use ()
Увеличивает количество использований GTypeModule на единицу. Если количество использований перед этим было 0, модуль будет загружен.
module :
Возвращает :
FALSE если необходимая загрузка модуля неудалась.
g_type_module_unuse ()
Уменьшает количество использований GTypeModule на единицу. Если результатом уменьшения будет 0, модуль выгружается. (Однако, GTypeModule не будет освобождена, а регистрация типов связанных с GTypeModule не отменяется. Как только GTypeModule инициализирована, она будет существовать всегда).
module :
g_type_module_set_name ()
Устанавливает имя для GTypeModule
module :
name :
Удобное для чтения имя используемое в сообщениях об ошибках.
g_type_module_register_type ()
Находит или регистрирует тип который реализуется специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается GTypeидентифицирующий тип, иначе тип вновь регистрируется и возвращается результирующий GType идентификатор.
Когда перерегистрируется тип (обычно потому что модуль выгружен а зтем загружен снова, и переинициализирован), module и parent_type должны быть такими же как предыдущие.
Пока любые экземпляры типа существуют, модуль типа не будет выгружен.
module :
parent_type :
тип для родительского класса
type_name :
имя для типа
type_info :
структура типовой информации
flags :
поле флажков обеспечивающих детали о типе
Возвращает :
новый или существующий ID типа
g_type_module_add_interface ()
Регистрирует дополнительный интерфейс для типа, у которого уже есть интерфейс в данном типовом модуле. Если интерфейс уже был зарегистрирован для типа в данном модуле, ничего не происходит.
Пока существуют любые интерфейсы типа, типовой модуль не будет выгружен.
module :
instance_type :
тип к которому добавляется интерфейс.
interface_type :
интерфейсный тип для добавления
interface_info :
структура типовой информации
g_type_module_register_enum ()
находит или регистрирует перечисление которое реализуется с помощью специфичного типового модуля. Если тип с именем type_name был предварительно зарегистрирован, возвращается GType идентификатор для типа, иначе тип вновь регистрируется и возвращается результирующий GType идентификатор.
Пока существуют любые экземпляры типа, типовой модуль не выгружается.
Начиная с версии 2.6
g_type_module_register_flags ()
Находит или регистрирует флаги типа который реализован специфичным типовым модулем. Если тип с именем type_name был предварительно зарегистрирован, возвращается GTypeидентификатор типа, иначе тип вновь регистрируется и возвращается GType идентификатор.
Пока существует любой экземпляр типа, модуль не будет выгружен.
Начиная с версии 2.6
G_DEFINE_DYNAMIC_TYPE()
Удобный макрос для динамической реализации типа, который объявляет функцию инициализации класса, функцию инициализации экземпляра (смотрите 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()
Более общая версия G_DEFINE_DYNAMIC_TYPE() которая позволяет определять GTypeFlags и произвольный код.
разворачивается до
TypeName :
Имя нового типа, в стиле CamelCase.
type_name :
Имя нового типа в нижнем регистре, со словами разделёнными символом '_'.
TYPE_PARENT :
GType родительского типа.
flags :
GTypeFlags помещаемые в g_type_register_static()
CODE :
Произвольный код вставляемый в функцию *_get_type().
Начиная с версии 2.14
Смотрите также
Интерфейс загрузчика абстрактного типа.
Портируемый механизм для динамической загрузки модулей.
Last updated
Was this helpful?