Revision: 6325
Author: ek.kato
Date: Tue Apr 13 21:09:36 2010
Log: * uim/dynlib.c
- (dynlib_unbind_all) : New.
- (dynlib_unbind_all_internal) : New. Call dlclose(3)
collectively at the end of this function to avoid GC problem.
- (uim_init_dynlib) : Add %%dynlib-unbind-all.
* scm/plugin.scm (module-unload-all) : Use %%dynlib-unbind-all.
http://code.google.com/p/uim/source/detail?r=6325
Modified:
/trunk/scm/plugin.scm
/trunk/uim/dynlib.c
=======================================
--- /trunk/scm/plugin.scm Sun Apr 4 20:35:54 2010
+++ /trunk/scm/plugin.scm Tue Apr 13 21:09:36 2010
@@ -230,6 +230,5 @@
(define module-unload-all
(lambda ()
- (for-each (lambda (module-entry)
- (module-unload (car module-entry)))
- plugin-alist) #t))
+ (%%dynlib-unbind-all plugin-alist)
+ #t))
=======================================
--- /trunk/uim/dynlib.c Sun Apr 4 20:35:54 2010
+++ /trunk/uim/dynlib.c Tue Apr 13 21:09:36 2010
@@ -75,6 +75,7 @@
static void *dynlib_unbind_internal(struct dynlib_unbind_args *);
static uim_lisp dynlib_bind(uim_lisp);
static void *dynlib_bind_internal(uim_lisp);
+static uim_lisp dynlib_unbind_all(uim_lisp);
static long
verbose_level(void)
@@ -91,6 +92,7 @@
{
uim_scm_init_proc1("%%dynlib-bind", dynlib_bind);
uim_scm_init_proc3("%%dynlib-unbind", dynlib_unbind);
+ uim_scm_init_proc1("%%dynlib-unbind-all", dynlib_unbind_all);
}
/* Called from uim_quit */
@@ -164,3 +166,46 @@
MAKE_FPTR(dynlib_instance_init),
MAKE_FPTR(dynlib_instance_quit));
}
+
+
+static void *
+dynlib_unbind_all_internal(uim_lisp plugin_alist_)
+{
+ /* call dlclose(3) collectively at the end in order to avoid GC problem
*/
+ uim_lisp alist_ = plugin_alist_;
+
+ while (!NULLP(alist_)) {
+ uim_lisp plugin_, quit_proc_;
+ void (*dynlib_instance_quit)(void);
+
+ plugin_ = CAR(alist_);
+ quit_proc_ = CAR(CDR(CDR(CDR(plugin_))));
+ if (!FALSEP(quit_proc_)) {
+ dynlib_instance_quit = C_FPTR(quit_proc_);
+ (*dynlib_instance_quit)();
+ }
+ alist_ = CDR(alist_);
+ }
+
+ alist_ = plugin_alist_;
+ while (!NULLP(alist_)) {
+ uim_lisp plugin_, lib_;
+ void *library;
+
+ plugin_ = CAR(alist_);
+ lib_ = CAR(CDR(plugin_));
+ if (!FALSEP(lib_)) {
+ library = C_PTR(lib_);
+ dlclose(library);
+ }
+ alist_ = CDR(alist_);
+ }
+
+ return uim_scm_t();
+}
+
+static uim_lisp
+dynlib_unbind_all(uim_lisp plugin_alist_)
+{
+ return
uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)dynlib_unbind_all_internal,
plugin_alist_);
+}
--
To unsubscribe, reply using "remove me" as the subject.