gwymoduleloader — Basic module loader interface
#define | GWY_MODULE_QUERY() |
#define | GWY_MODULE_QUERY2() |
gboolean | (*GwyModuleRegisterFunc) () |
GwyModuleInfo * | (*GwyModuleQueryFunc) () |
const GwyModuleRecord * | (*GwyModuleBundleRegisterFunc) () |
GQuark | gwy_module_error_quark () |
void | gwy_module_register_modules () |
const GwyModuleInfo * | gwy_module_lookup () |
const gchar * | gwy_module_get_filename () |
GSList * | gwy_module_get_functions () |
void | gwy_module_foreach () |
void | gwy_module_failure_foreach () |
const GwyModuleInfo * | gwy_module_register_module () |
void | gwy_module_disable_registration () |
void | gwy_module_enable_registration () |
gboolean | gwy_module_is_enabled () |
#define | GWY_MODULE_ABI_VERSION |
#define | GWY_MODULE_BUNDLE_FLAG |
#define | GWY_MODULE_ERROR |
enum | GwyModuleError |
struct | GwyModuleRecord |
struct | GwyModuleInfo |
GwyModuleFailureInfo |
#include <libgwymodule/gwymodule.h>
#define GWY_MODULE_QUERY(mod_info)
The module query must be the ONLY exported symbol from a module.
This macro does The Right Thing necessary to export module info in a way Gwyddion understands it. Put
GWY_MODULE_QUERY
with the module info (GwyModuleInfo) of your module as its argument on a line (with NO semicolon
after).
If you write a module in C++ note the module query must have C linkage. This is achieved by marking it
extern "C"
:
1 2 3 |
extern "C" { GWY_MODULE_QUERY(module_info) } |
This has to be done manually in versions up to 2.24; since version 2.25 * GWY_MODULE_QUERY()
includes
extern "C"
automatically if it is compiled using a C++ compiler.
mod_info |
The GwyModuleInfo structure to return as module info. |
#define GWY_MODULE_QUERY2(mod_info,mod_name)
The module query must be the ONLY exported symbol from a module.
See GWY_MODULE_QUERY
for discussion.
This macro is intended for modules that can be bundled together to one big shared library for time and space optimization. This mostly makes sense only for modules included in Gwyddion itself as it contains hundreds of modules.
However, it safe to use in third party modules because if modules are not bundled the macro behaves exactly as
GWY_MODULE_QUERY
and the mod_name
argument is just ignored. The macro expansion differs only when
GWY_MODULE_BUNDLING
is defined when including the "gwymoduleloader.h" header.
The module name mod_name
is given as a C identifier, not a string. It must be identical to
the file name of the module if it was installed standalone, with extension removed and with non-identifier
characters converted to underscores. For instance module implemented in "nt-mdt.c" and installed as "nt-mdt.so" or
"nt-mdt.dll" (or with other extensions, depending on the operating system) must pass nt_mdt
. If
it does not match the file name, linking will fail with a confusing message when bundling is enabled.
mod_info |
The GwyModuleInfo structure to return as module info. |
|
mod_name |
Module name, given as C identifier corresponding to file name withough extension. |
Since: 2.49
gboolean
(*GwyModuleRegisterFunc) (void
);
Module registration function type.
It actually runs particular featrue registration functions, like gwy_file_func_register()
and
gwy_process_func_register()
.
If the module has a complex initialisation it may be safer to simply not register any function but return TRUE
even if it fails to set up itself correctly. The module feature unregistration is somewhat crude and, generally,
unregisteration may lead to disaster when shared library unloading has unexpected side effects.
Whether the registration succeeded. When it returns FALSE
, the module and its features are unregistered.
GwyModuleInfo *
(*GwyModuleQueryFunc) (void
);
Module query function type.
The module query function should be simply declared as GWY_MODULE_QUERY(mod_info), where mod_info is module info struct for the module.
The module info struct.
const GwyModuleRecord *
(*GwyModuleBundleRegisterFunc) (void
);
Module bundle query function type.
It returns an array of module records for all modules in the bundle, terminated by {NULL
, NULL
}.
Since: 2.49
GQuark
gwy_module_error_quark (void
);
Returns error domain for module loading.
See and use GWY_MODULE_ERROR
.
The error domain.
void
gwy_module_register_modules (const gchar **paths
);
Registers all modules in given directories.
It can be called several times (on different directories). No errors are reported, register modules individually
with gwy_module_register_module()
to get registration errors.
If you need to prevent specific modules from loading use gwy_module_disable_registration()
beforehand.
paths |
A |
const GwyModuleInfo *
gwy_module_lookup (const gchar *name
);
Returns information about one module.
name |
A module name. |
The module info, of NULL
if not found. It must be considered constant and never modified or freed.
const gchar *
gwy_module_get_filename (const gchar *name
);
Returns full file name of a module.
name |
A module name. |
Module file name as a string that must be modified or freed.
GSList *
gwy_module_get_functions (const gchar *name
);
Returns list of names of functions a module implements.
name |
A module name. |
List of module function names, as a GSList that is owned by module loader and must not be modified or freed.
void gwy_module_foreach (GHFunc function
,gpointer data
);
Runs function
on each registered module.
It passes module name as the key and pointer to module info (GwyModuleInfo) as the value. Neither should be modified.
function |
A GHFunc run for each module. |
|
data |
User data. |
void gwy_module_failure_foreach (GFunc function
,gpointer data
);
Runs function
for each module that failed to register.
It passes the failure info (GwyModuleFailureInfo) as the data argument. It should be modified.
function |
A GFunc run for each module registration failure. |
|
data |
User data. |
Since: 2.49
const GwyModuleInfo * gwy_module_register_module (const gchar *name
,GError **error
);
Loads a single module.
This function also works with bundles. The returned module info is for the bundle and thus not of much use.
name |
Module file name to load, including full path and extension. |
|
error |
Location to store error, or |
Module info on success, NULL
on failure.
void
gwy_module_disable_registration (const gchar *name
);
Prevents the registration of a module of given name.
This function blocks future module registration using gwy_module_register_modules()
. Already loaded modules are
unaffected. The low-level module loading function gwy_module_register_module()
always attempts to load the module,
even if blocked.
name |
A module name. |
Since: 2.48
void
gwy_module_enable_registration (const gchar *name
);
Unblocks the registration of a module of given name.
This function influences future module registration. Already loaded modules are unaffected.
name |
A module name. |
Since: 2.48
gboolean
gwy_module_is_enabled (const gchar *name
);
Reports whether the registration of a module is enabled.
If the registration of module name
was prevented using gwy_module_disable_registration()
and not subsequently
re-enabled using gwy_module_enabled_registration()
this function returns FALSE
.
The reported values only represents the current state of blocking. A module name
could have been loaded when it
was not blocked.
name |
A module name. |
TRUE
if module name
can be registered; FALSE
when it is blocked from registration.
Since: 2.48
#define GWY_MODULE_ABI_VERSION 2
Gwyddion module ABI version.
To be filled as abi_version
in GwyModuleInfo.
#define GWY_MODULE_BUNDLE_FLAG 256u
Value to bitwise combine with GWY_MODULE_ABI_VERSION
to indicate a bundle.
Since: 2.49
#define GWY_MODULE_ERROR gwy_module_error_quark()
Type of module loading and registration error.
Module has an invalid name. It is recommended that module names are valid C identifiers, possibly with dashes instead of underscores, but only really broken names are rejected. |
||
A module of the same name has already been registered. |
||
Calling |
||
Module does not contain any query function. |
||
Module has different ABI version than expected/supported; or required info field are missing. |
||
Module query function provided |
||
The registration function returned |
||
Nested module bundle found. (Since 2.49) |
struct GwyModuleRecord { GwyModuleQueryFunc query; const gchar *name; };
Module record returned by bundle query function.
GwyModuleQueryFunc |
Module query function. |
|
const gchar * |
Module name (base file name without extensions). |
Since: 2.49
struct GwyModuleInfo { guint32 abi_version; GwyModuleRegisterFunc register_func; const gchar *blurb; const gchar *author; const gchar *version; const gchar *copyright; const gchar *date; };
Module information returned by GWY_MODULE_QUERY()
.
guint32 |
Gwyddion module ABI version, should be always GWY_MODULE_ABI_VERSION. |
|
GwyModuleRegisterFunc |
Module registration function (the function run by Gwyddion module system, actually registering particular module features). |
|
const gchar * |
Some module description. |
|
const gchar * |
Module author(s). |
|
const gchar * |
Module version. |
|
const gchar * |
Who has copyright on this module. |
|
const gchar * |
Date (year). |
typedef struct { const gchar *filename; const gchar *modname; const gchar *err_message; gint err_domain; gint err_code; } GwyModuleFailureInfo;
Information about a failed module registration.
const gchar * |
Name of the file the module was loaded from. |
|
const gchar * |
Module name (can be |
|
const gchar * |
Error message from the failed module registration. |
|
gint |
GError domain from the failed module registration. |
|
gint |
GError code from the failed module registration. |
Since: 2.49