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.

Reply via email to