glib 에서는 이게 가능함.
g_type_module_use (G_TYPE_MODULE (module)) /* dlopen() */
my_object = g_object_new (module->type, NULL); /* my_object 소스내 함수 실행됨 */
g_type_module_unuse (G_TYPE_MODULE (module)); /* dlclose */
my_object_do_something (my_object); /* my_object 소스내 함수, 에러 안 남 */
glib 소스코드를 보니
g_type_module_use 하면 dlopen() 호출되고,
g_type_module_unuse 하면 dlclose() 호출됨.
즉, dlclose() 이후 my_object 함수 호출이 가능한데, 어떻게 그게 가능한지 이해가 안 됨.
GTypeModule 를 모르니... api 문서에서 제공하는데로 그냥 갖다 쓰기만 해서 어떤 원리로 접근 가능한지 모름.
아마 그 비밀이
static gpointer
_g_module_open (const gchar *file_name,
gboolean bind_lazy,
gboolean bind_local)
{
gpointer handle;
handle = dlopen (file_name,
(bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW));
if (!handle)
g_module_set_error (fetch_dlerror (TRUE));
return handle;
}
static gpointer
_g_module_self (void)
{
gpointer handle;
/* to query symbols from the program itself, special link options
* are required on some systems.
*/
/* On Android 32 bit (i.e. not __LP64__), dlopen(NULL)
* does not work reliable and generally no symbols are found
* at all. RTLD_DEFAULT works though.
* On Android 64 bit, dlopen(NULL) seems to work but dlsym(handle)
* always returns 'undefined symbol'. Only if RTLD_DEFAULT or
* NULL is given, dlsym returns an appropriate pointer.
*/
#if defined(__BIONIC__)
handle = RTLD_DEFAULT;
#else
handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY);
#endif
if (!handle)
g_module_set_error (fetch_dlerror (TRUE));
return handle;
}
아 몰랑 posix c 사용하여 오늘은 플러그인 로딩 부분 재작성하구 자야지
몇 달 지나면 안드로이드에서도 그대로 올릴 수 있음. 좀만 참자.
구글 키보드(GBorad) 축하면 에러나서 그것도 자체 제작해서 쓸거임!! 진짜임!!!
올릴 수 --- 돌릴 수, 축하면 --- 툭하면, 이놈의 오타
구글도 다국어 입력 프레임워크 만드는게 어려운가 봄. 한 달에 두세번 꼴로 에러나서 입력이 안 됨. 어제는 GBoard 반만 안 보이고 GBoard 가 멈춰서 입력이 안 되더라. 그래서 LG 키보드 쓰고 있는데, 반응 속도가 열라 느림. 글자가 화면에 찍히는거 보고 눌러야 함. ㅎㅎㅎ 요새 소프트웨어 진짜 개판임!!!!
내부적으로 모듈에 대한 카운트를 따로 보관하던가 하겠지
확인해봤는데, dlopen 관련한 마술 같은 건 없었고, module->use_count++ 하네. 근데 내가 모르는 곳에서 module->use_count++ 되는 것도 있는지.. 아니면 불일치하는 것도 있는지 그건 모르겠네. 불일치하는 관련 버그는 이미 훨씬 과거에 있긴 있었더라구. g_type_module_use 했으면 g_type_module_unuse 를 두번해야 해제됨. 아직도 이해불가 ㅎㅎㅎ
https://github.com/ImageMagick/glib/blob/f60cfb33b49c881c791466eabb22ab098f68029d/gobject/gtypemodule.c#L37
인스턴스 하나라도 남아있으면 살아있다고 돼있네