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