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);

}