Author: omote.masahito
Date: Thu Apr 24 07:59:18 2008
New Revision: 5439

Modified:
  trunk/scm/plugin.scm
  trunk/uim/plugin.c

Log:
* uim/plugin.c
 - (module_bind, module_unbind): Make it GC Safe.
 - (module_bind_internal): New function. Main functionarity is moved here.
 - (module_unbind_internal): Ditto.
 - (uim_quit_plugin): Use "(module-unload-all)".
 - (uim_quit_plugin_internal): Removed.
* scm/plugin.scm
 - (module-load):
    - Add check for the existance of modules not to overload.
    - Fix a bug not loading scm files. This bug made mismatch between
      loader.scm and installed-modules.scm
 - (module-unload): Add check for the existance of modules.
 - (module-unload-all): New function for the replacement for
                        uim_quit_plugin_internal in uim/plugin.c.


Modified: trunk/scm/plugin.scm
==============================================================================
--- trunk/scm/plugin.scm        (original)
+++ trunk/scm/plugin.scm        Thu Apr 24 07:59:18 2008
@@ -197,8 +197,9 @@

(define module-load
  (lambda (module-name)
- (and-let* ((lib-path (find-module-lib-path uim-plugin-lib-load-path module-name))
-
+    (and-let* ((module-not-exists? (not (plugin-list-query module-name)))
+              (lib-path (find-module-lib-path uim-plugin-lib-load-path
+                                              module-name))
               (proc-ptrs (module-bind lib-path))
               (library-ptr (car proc-ptrs))
               (init-proc (car (cdr proc-ptrs)))
@@ -210,18 +211,25 @@
                  (begin
                    (set! scm-path (find-module-scm-path
                                    uim-plugin-scm-load-path module-name))
-                   (if (not scm-path) (try-require scm-path))
                    (plugin-list-append module-name
                                        library-ptr
                                        init-proc
                                        quit-proc)
+                   (if (string? scm-path) (try-require scm-path))
                    #t)
                  #f))))

(define module-unload
  (lambda (module-name)
-    (and-let* ((library-ptr (plugin-list-query-library module-name))
+    (and-let* ((module-exists? (plugin-list-query module-name))
+              (library-ptr (plugin-list-query-library module-name))
               (init-proc (plugin-list-query-instance-init module-name))
               (quit-proc (plugin-list-query-instance-quit module-name)))
              (module-unbind library-ptr init-proc quit-proc)
              (plugin-list-delete module-name) #t)))
+
+(define module-unload-all
+  (lambda ()
+    (for-each (lambda (module-entry)
+                      (module-unload (car module-entry)))
+     plugin-alist) #t))

Modified: trunk/uim/plugin.c
==============================================================================
--- trunk/uim/plugin.c  (original)
+++ trunk/uim/plugin.c  Thu Apr 24 07:59:18 2008
@@ -83,8 +83,15 @@
static void *plugin_unload_internal(void *uim_lisp_name);
static void *uim_quit_plugin_internal(void *dummy);

+struct module_unbind_args {
+  uim_lisp lib_ptr;
+  uim_lisp init_proc;
+  uim_lisp quit_proc;
+};
static uim_lisp module_unbind(uim_lisp, uim_lisp, uim_lisp);
+static void *module_unbind_internal(struct module_unbind_args *);
static uim_lisp module_bind(uim_lisp);
+static void *module_bind_internal(uim_lisp);

static long
verbose_level(void)
@@ -254,6 +261,15 @@
  UIM_CATCH_ERROR_END();
}

+static void *
+uim_quit_plugin_internal(void *uim_lisp_name)
+{
+  uim_lisp ret;
+  ret = uim_scm_callf("module-unload-all", "");
+
+  return ret;
+}
+
/* Called from uim_quit */
void
uim_quit_plugin(void)
@@ -266,32 +282,27 @@
  UIM_CATCH_ERROR_END();
}

-static void *
-uim_quit_plugin_internal(void *dummy)
-{
-  uim_lisp alist, rest, entry, name;
-
-  alist = uim_scm_eval_c_string("plugin-alist");
-  for (rest = alist; !NULLP(rest); rest = CDR(rest)) {
-    entry = CAR(rest);
-    name = CAR(entry);
-
-    plugin_unload(name);
-  }
-
-  return NULL;
-}
-
static uim_lisp
module_unbind(uim_lisp lib_ptr,
              uim_lisp init_proc,
              uim_lisp quit_proc)
{
+  struct module_unbind_args args;
+  args.lib_ptr = lib_ptr;
+  args.init_proc = init_proc;
+  args.quit_proc = quit_proc;
+
+ return uim_scm_call_with_gc_ready_stack(module_unbind_internal, (void *)&args);
+}
+
+static void *
+module_unbind_internal(struct module_unbind_args *args)
+{
  void *library;
  void (*plugin_instance_quit)(void);

-  library = C_PTR(lib_ptr);
-  plugin_instance_quit = C_FPTR(quit_proc);
+  library = C_PTR(args->lib_ptr);
+  plugin_instance_quit = C_FPTR(args->quit_proc);

  (plugin_instance_quit)();
  dlclose(library);
@@ -301,6 +312,12 @@

static uim_lisp
module_bind(uim_lisp name)
+{
+  return uim_scm_call_with_gc_ready_stack(module_bind_internal, (void *)name);
+}
+
+static void *
+module_bind_internal(uim_lisp name)
{
  void *library;
  void (*plugin_instance_init)(void);

Reply via email to