GLib.TypeModule based Plugin in Vala
This example shows you how to implement a GLib.TypeModule based plugin in Vala. It also shows the usage of static construct/destruct block. Plugin itself: plugin.vala
public class MyClass : Object
{
static construct
{
message("MyClass init");
}
static ~MyClass()
{
message("MyClass deinit");
}
}
[ModuleInit]
Type plugin_init(GLib.TypeModule type_modul)
{
return typeof(MyClass);
}
Plugin loader: loader.vala
class MyModule : TypeModule
{
[CCode (has_target = false)]
private delegate Type PluginInitFunc(TypeModule module);
private GLib.Module module = null;
private string name = null;
public MyModule(string name)
{
this.name = name;
}
public override bool load()
{
string path = Module.build_path(null, name);
module = Module.open(path, GLib.ModuleFlags.BIND_LAZY);
if(null == module) {
error("Module not found");
}
void * plugin_init = null;
if(! module.symbol("plugin_init", out plugin_init)) {
error("No such symbol");
}
((PluginInitFunc) plugin_init)(this);
return true;
}
public override void unload()
{
module = null;
message("Library unloaded");
}
}
// Never unref instance of GTypeModule
// http://www.lanedo.com/~mitch/module-system-talk-guadec-2006/Module-System-Talk-Guadec-2006.pdf
static TypeModule module = null;
int main()
{
module = new MyModule("plugin");
module.load();
var o = GLib.Object.new(Type.from_name("MyClass"));
// free last instance, plugin unload
o = null;
return 0;
}
Build
$ valac -o loader loader.vala --pkg=gmodule-2.0 $ valac --ccode plugin.vala $ gcc -fPIC -shared -o libplugin.so plugin.c $(pkg-config --libs --cflags gobject-2.0 gmodule-2.0)
Run
$ LD_LIBRARY_PATH=$PWD ./loader ** Message: plugin.vala:5: MyClass init ** Message: plugin.vala:10: MyClass deinit ** Message: loader.vala:37: Library unloaded