glib 가 훌륭한 물건임에는 의심하지 않음.
그러나 GTypeModule 열라 구림. g_object_unref 가 안 됨. 진짜임!!
보통 GTypeModule 을 상속 받아서 구현하는게 흔하긴 한데..
그렇게 구현하면 glib 에 GTypeModule 을 상속받아 구현한 모듈이 있는데
그거랑 너무 똑같은 소스코드가 됨.
게다가 그런 코드가 GPL 류의 소프트웨어(evince, nautilus 등)에서 발견되는 바,
GTypeModule 안 쓰고 커스텀으로 가는게 좋음. 안그러면 라이선스 이슈에 휘말릴 수 있음.
그래서... 자체 제작 커스텀으로 교체했음 ㅋㅋㅋ
G_DEFINE_DYNAMIC_TYPE 을 G_DEFINE_TYPE 으로
G_DEFINE_DYNAMIC_TYPE_EXTENDED 을 G_DEFINE_TYPE_EXTENDED
G_IMPLEMENT_INTERFACE_DYNAMIC 을 G_IMPLEMENT_INTERFACE 으로 교체하는게 핵심
나중에 이거 glib 걷어내고 자체 module manager 로 키울 생각^^
TianModule *
tian_module_new (const char *path)
{
g_return_val_if_fail (path != NULL, NULL);
TianModule *module;
const char *errstr;
GType (* module_get_type) (void);
module = calloc (1, sizeof (TianModule));
module->path = strdup (path);
module->lib = dlopen (module->path, RTLD_LAZY | RTLD_LOCAL);
if (!module->lib)
goto FAIL;
if (!(module_get_type = dlsym (module->lib, "module_get_type")))
goto FAIL;
module->type = module_get_type ();
return module;
FAIL:
if ((errstr = dlerror ()))
g_warning (G_STRLOC ": %s", errstr);
if (module->lib)
dlclose (module->lib);
free (module->path);
free (module);
return NULL;
}
void
tian_module_free (TianModule *module)
{
dlclose (module->lib);
free (module->path);
free (module);
}
댓글 0