Author: yamakenz
Date: Mon Apr 28 09:38:41 2008
New Revision: 5456
Modified:
trunk/scm/plugin.scm
trunk/scm/tutcode.scm
trunk/uim/plugin.c
trunk/uim/plugin.h
trunk/uim/uim-internal.h
trunk/uim/uim.c
Log:
* This commit make plugin.c responsible only for bare dynamic library
loading/unloading. See [uim-en 121] for further information.
* uim/plugin.h
- (uim_plugin_instance_init, uim_plugin_instance_quit):
Replaced with the backward compatibility alias macro to
uim_dynlib_instance_{init,quit}()
- (uim_dynlib_instance_init, uim_dynlib_instance_quit):
Renamed from uim_plugin_instance_{init,quit}()
* uim/plugin.c
- Exclude no longer needed string.h, dirent.h, unistd.h,
stdlib.h, sys/types.h, sys/stat.h, sys/param.h, fcntl.h,
errno.h, pwd.h
- Exclude inappropriately incldued plugin.h
- (PLUGIN_PREFIX, PLUGIN_SUFFIX, plugin_load, plugin_unload,
plugin_unload_internal, uim_quit_plugin_internal): Removed
- (UIM_VLEVEL_PLUGIN): Rename to UIM_VLEVEL_DYNLIB
- (UIM_VLEVEL_DYNLIB): Renamed from UIM_VLEVEL_PLUGIN
- (module_unbind_args, module_unbind, module_unbind_internal,
module_bind, module_bind_internal): Rename to dynlib_*
- (dynlib_unbind_args, dynlib_unbind, dynlib_unbind_internal,
dynlib_bind, dynlib_bind_internal):
* Renamed from module_*
* Follow the renamings
- (uim_init_plugin): Rename to uim_init_dynlib()
- (uim_init_dynlib):
* Renamed from uim_init_plugin
* Remove unneeded error guard (already guarded in uim_init)
* Remove load-plugin and unload-plugin registration
* Follow the renaming of module_bind and module_unbind
* Rename module-bind and module-unbind with %%dynlib-bind
and %%dynlib-unbind. The %% prefix is prepended to
indicate that these procedures are implementation-specific
and should not be used directly
- (uim_quit_plugin): Rename to uim_quit_dynlib()
- (uim_quit_dynlib):
* Renamed from uim_quit_plugin()
* Remove anything. The module-unload-all call is moved to
uim_quit() to separate module system responsibility from this
simple dynamic-library load/unload layer
* uim/uim-internal.h
- (uim_init_plugin, uim_quit_plugin): Rename to
uim_{init,quit}_dynlib()
* uim/uim.c
- (uim_init_internal):
* Follow the renamings
* Move uim_quit_plugin() call to very end of the quit procedure
* Moved module-unload-all call from uim_quit_plugin()
* scm/plugin.scm
- (module-load, module-unload): Follow the renamings of
module-{bind,unbind}
* scm/tutcode.scm
- Ditto
Modified: trunk/scm/plugin.scm
==============================================================================
--- trunk/scm/plugin.scm (original)
+++ trunk/scm/plugin.scm Mon Apr 28 09:38:41 2008
@@ -200,7 +200,7 @@
(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))
+ (proc-ptrs (%%dynlib-bind lib-path))
(library-ptr (car proc-ptrs))
(init-proc (car (cdr proc-ptrs)))
(quit-proc (car (cdr (cdr proc-ptrs))))
@@ -225,7 +225,7 @@
(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)
+ (%%dynlib-unbind library-ptr init-proc quit-proc)
(plugin-list-delete module-name) #t)))
(define module-unload-all
Modified: trunk/scm/tutcode.scm
==============================================================================
--- trunk/scm/tutcode.scm (original)
+++ trunk/scm/tutcode.scm Mon Apr 28 09:38:41 2008
@@ -93,7 +93,7 @@
;;(load-plugin "skk") ;SKK����θ���θ���Τ��ᡢlibuim-skk.so�����
;; FIXME: Temporary workaround for the module system reorganization
(and-let* ((lib-path (find-module-lib-path uim-plugin-lib-load-path "skk"))
- (proc-ptrs (module-bind lib-path))))
+ (proc-ptrs (%%dynlib-bind lib-path))))
(require "tutcode-bushudic.scm") ;������Ѵ�����
;;; user configs
Modified: trunk/uim/plugin.c
==============================================================================
--- trunk/uim/plugin.c (original)
+++ trunk/uim/plugin.c Mon Apr 28 09:38:41 2008
@@ -36,24 +36,12 @@
#include <config.h>
#include <stdio.h>
-#include <string.h>
#include <dlfcn.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <pwd.h>
-#include <sys/param.h>
#include "uim.h"
+#include "uim-internal.h"
#include "uim-scm.h"
#include "uim-scm-abbrev.h"
-#include "plugin.h"
-#include "uim-internal.h"
#if UIM_USE_NOTIFY
#include "uim-notify.h"
#endif
@@ -64,14 +52,11 @@
((void (*)(void))(uintptr_t)dlsym((handle), (symbol)))
#endif
-#define PLUGIN_PREFIX "libuim-"
-#define PLUGIN_SUFFIX ".so"
-
/*
* SIOD's verbose-level compatible definition.
* See sigscheme/operations-siod.c for further information.
*/
-#define UIM_VLEVEL_PLUGIN 3
+#define UIM_VLEVEL_DYNLIB 3
#ifdef DEBUG
#define DPRINTFN(n,x) if ((n) <= verbose_level()) fprintf x;
@@ -80,18 +65,16 @@
#endif
static long verbose_level(void);
-static void *plugin_unload_internal(void *uim_lisp_name);
-static void *uim_quit_plugin_internal(void *dummy);
-struct module_unbind_args {
+struct dynlib_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 uim_lisp dynlib_unbind(uim_lisp, uim_lisp, uim_lisp);
+static void *dynlib_unbind_internal(struct dynlib_unbind_args *);
+static uim_lisp dynlib_bind(uim_lisp);
+static void *dynlib_bind_internal(uim_lisp);
static long
verbose_level(void)
@@ -102,248 +85,82 @@
return C_INT(vlevel);
}
-static uim_lisp
-plugin_load(uim_lisp _name)
-{
- const char *plugin_name;
- char plugin_lib_filename[MAXPATHLEN], plugin_scm_filename[MAXPATHLEN];
- uim_lisp lib_path = uim_scm_eval_c_string("uim-plugin-lib-load-path");
- uim_lisp scm_path = uim_scm_eval_c_string("uim-plugin-scm-load-path");
- uim_lisp path_car, path_cdr;
- void *library;
- void (*plugin_instance_init)(void);
- void (*plugin_instance_quit)(void);
-
- plugin_lib_filename[0] = plugin_scm_filename[0] = '\0';
- plugin_name = REFER_C_STR(_name);
-
- if (plugin_name == NULL) {
- return uim_scm_f();
- }
-
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Searching libuim-%s.so.\n",
plugin_name));
-
- for (path_cdr = lib_path;
- !NULLP(path_cdr);
- path_cdr = CDR(path_cdr))
- {
- int fd;
- const char *path;
- path_car = CAR(path_cdr);
- path = REFER_C_STR(path_car);
- snprintf(plugin_lib_filename, sizeof(plugin_lib_filename), "%s/%s%s%s",
- path, PLUGIN_PREFIX, plugin_name, PLUGIN_SUFFIX);
- fd = open(plugin_lib_filename, O_RDONLY);
- if (fd >= 0) {
- close(fd);
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Found %s.\n",
plugin_lib_filename));
- break;
- }
- plugin_lib_filename[0] = '\0';
- }
-
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Searching %s.scm.\n", plugin_name));
- for (path_cdr = scm_path;
- !NULLP(path_cdr);
- path_cdr = CDR(path_cdr))
- {
- int fd;
- const char *path;
- path_car = CAR(path_cdr);
- path = REFER_C_STR(path_car);
- snprintf(plugin_scm_filename, sizeof(plugin_scm_filename), "%s/%s.scm",
path, plugin_name);
- fd = open(plugin_scm_filename, O_RDONLY);
- if (fd >= 0) {
- close(fd);
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Found %s.\n",
plugin_scm_filename));
- break;
- }
- plugin_scm_filename[0] = '\0';
- }
-
- if (plugin_lib_filename[0] == '\0') {
- return uim_scm_f();
- }
-
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Loading libuim-%s.so.\n",
plugin_name));
- library = dlopen(plugin_lib_filename, RTLD_NOW);
-
- if (library == NULL) {
- uim_notify_fatal(N_("%s plugin: Load failed."), dlerror());
- return uim_scm_f();
- }
-
- plugin_instance_init
- = (void (*)(void))dlfunc(library, "uim_plugin_instance_init");
- plugin_instance_quit
- = (void (*)(void))dlfunc(library, "uim_plugin_instance_quit");
- if (!plugin_instance_init) {
- uim_notify_fatal(N_("%s plugin: Init failed."), plugin_name);
- return uim_scm_f();
- }
-
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Calling plugin_instance_init() for
%s.\n", plugin_name));
- (plugin_instance_init)();
- if (plugin_scm_filename[0] != '\0') {
- uim_bool succeeded;
-
- succeeded = uim_scm_require_file(plugin_scm_filename);
- if (!succeeded) {
- /* FIXME: gettext here to expand %s in accordance with the
- * locale for the selected notification agent. See also the TODO
- * comment of uim-notify.h -- YamaKen 2008-02-11 */
- uim_notify_fatal(N_("%s plugin: Subsequent %s load failed."),
- plugin_name, plugin_scm_filename);
- return uim_scm_f();
- }
- }
-
- {
- uim_lisp form;
- form = LIST5(MAKE_SYM("plugin-list-append"),
- _name,
- MAKE_PTR(library),
- MAKE_FPTR(plugin_instance_init),
- MAKE_FPTR(plugin_instance_quit));
- uim_scm_eval(form);
- }
-
- return uim_scm_t();
-}
-
-static uim_lisp
-plugin_unload(uim_lisp _name)
-{
- return (uim_lisp)uim_scm_call_with_gc_ready_stack(plugin_unload_internal,
- (void *)_name);
-}
-
-static void *
-plugin_unload_internal(void *uim_lisp_name)
-{
- uim_lisp _name;
- uim_lisp ret;
- void *library;
- void (*plugin_instance_quit)(void);
-
- _name = (uim_lisp)uim_lisp_name;
-
- ret = uim_scm_callf("plugin-list-query-library", "o", _name);
- if (FALSEP(ret))
- return uim_scm_f();
- library = C_PTR(ret);
-
- ret = uim_scm_callf("plugin-list-query-instance-quit", "o", _name);
- if (FALSEP(ret))
- return uim_scm_f();
- plugin_instance_quit = C_FPTR(ret);
-
- (plugin_instance_quit)();
- dlclose(library);
-
- uim_scm_callf("plugin-list-delete", "o", _name);
-
- return (void *)uim_scm_t();
-}
-
/* Called from uim_init */
void
-uim_init_plugin(void)
-{
- if (UIM_CATCH_ERROR_BEGIN())
- return;
-
- uim_scm_init_proc1("load-plugin", plugin_load);
- uim_scm_init_proc1("unload-plugin", plugin_unload);
- uim_scm_init_proc1("module-bind", module_bind);
- uim_scm_init_proc3("module-unbind", module_unbind);
-
- UIM_CATCH_ERROR_END();
-}
-
-static void *
-uim_quit_plugin_internal(void *uim_lisp_name)
+uim_init_dynlib(void)
{
- uim_lisp ret;
- ret = uim_scm_callf("module-unload-all", "");
-
- return ret;
+ uim_scm_init_proc1("%%dynlib-bind", dynlib_bind);
+ uim_scm_init_proc3("%%dynlib-unbind", dynlib_unbind);
}
/* Called from uim_quit */
void
-uim_quit_plugin(void)
+uim_quit_dynlib(void)
{
- if (UIM_CATCH_ERROR_BEGIN())
- return;
-
- uim_scm_call_with_gc_ready_stack(uim_quit_plugin_internal, NULL);
-
- UIM_CATCH_ERROR_END();
}
static uim_lisp
-module_unbind(uim_lisp lib_ptr,
+dynlib_unbind(uim_lisp lib_ptr,
uim_lisp init_proc,
uim_lisp quit_proc)
{
- struct module_unbind_args args;
+ struct dynlib_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);
+ return
uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)dynlib_unbind_internal,
(void *)&args);
}
static void *
-module_unbind_internal(struct module_unbind_args *args)
+dynlib_unbind_internal(struct dynlib_unbind_args *args)
{
void *library;
- void (*plugin_instance_quit)(void);
+ void (*dynlib_instance_quit)(void);
library = C_PTR(args->lib_ptr);
- plugin_instance_quit = C_FPTR(args->quit_proc);
+ dynlib_instance_quit = C_FPTR(args->quit_proc);
- (plugin_instance_quit)();
+ (*dynlib_instance_quit)();
dlclose(library);
return uim_scm_t();
}
static uim_lisp
-module_bind(uim_lisp name)
+dynlib_bind(uim_lisp name)
{
- return uim_scm_call_with_gc_ready_stack(module_bind_internal, (void *)name);
+ return
uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)dynlib_bind_internal,
(void *)name);
}
static void *
-module_bind_internal(uim_lisp name)
+dynlib_bind_internal(uim_lisp name)
{
void *library;
- void (*plugin_instance_init)(void);
- void (*plugin_instance_quit)(void);
+ void (*dynlib_instance_init)(void);
+ void (*dynlib_instance_quit)(void);
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Loading %s", REFER_C_STR(name)));
+ DPRINTFN(UIM_VLEVEL_DYNLIB, (stderr, "Loading %s", REFER_C_STR(name)));
library = dlopen(REFER_C_STR(name), RTLD_NOW);
if (library == NULL) {
- uim_notify_fatal(N_("module: %s: Load failed."), dlerror());
+ uim_notify_fatal(N_("dynlib: %s: Load failed."), dlerror());
return uim_scm_f();
}
- plugin_instance_init
- = (void (*)(void))dlfunc(library, "uim_plugin_instance_init");
- plugin_instance_quit
- = (void (*)(void))dlfunc(library, "uim_plugin_instance_quit");
- if (!plugin_instance_init) {
- uim_notify_fatal(N_("module: %s: Initialize failed."), REFER_C_STR(name));
+ dynlib_instance_init
+ = (void (*)(void))dlfunc(library, "uim_dynlib_instance_init");
+ dynlib_instance_quit
+ = (void (*)(void))dlfunc(library, "uim_dynlib_instance_quit");
+ if (!dynlib_instance_init) {
+ uim_notify_fatal(N_("dynlib: %s: Initialize failed."), REFER_C_STR(name));
return uim_scm_f();
}
- DPRINTFN(UIM_VLEVEL_PLUGIN, (stderr, "Calling plugin_instance_init() for
%s.\n", REFER_C_STR(name)));
- (plugin_instance_init)();
+ DPRINTFN(UIM_VLEVEL_DYNLIB, (stderr, "Calling dynlib_instance_init() for
%s.\n", REFER_C_STR(name)));
+ (*dynlib_instance_init)();
return LIST3(MAKE_PTR(library),
- MAKE_FPTR(plugin_instance_init),
- MAKE_FPTR(plugin_instance_quit));
+ MAKE_FPTR(dynlib_instance_init),
+ MAKE_FPTR(dynlib_instance_quit));
}
Modified: trunk/uim/plugin.h
==============================================================================
--- trunk/uim/plugin.h (original)
+++ trunk/uim/plugin.h Mon Apr 28 09:38:41 2008
@@ -39,8 +39,12 @@
extern "C" {
#endif
-void uim_plugin_instance_init(void);
-void uim_plugin_instance_quit(void);
+void uim_dynlib_instance_init(void);
+void uim_dynlib_instance_quit(void);
+
+/* Temporary backward compatibility */
+#define uim_plugin_instance_init uim_dynlib_instance_init
+#define uim_plugin_instance_quit uim_dynlib_instance_quit
#ifdef __cplusplus
}
Modified: trunk/uim/uim-internal.h
==============================================================================
--- trunk/uim/uim-internal.h (original)
+++ trunk/uim/uim-internal.h Mon Apr 28 09:38:41 2008
@@ -150,8 +150,8 @@
/* throw recoverable error */
void uim_throw_error(const char *msg);
-void uim_init_plugin(void);
-void uim_quit_plugin(void);
+void uim_init_dynlib(void);
+void uim_quit_dynlib(void);
void uim_init_im_subrs(void);
void uim_init_key_subrs(void);
Modified: trunk/uim/uim.c
==============================================================================
--- trunk/uim/uim.c (original)
+++ trunk/uim/uim.c Mon Apr 28 09:38:41 2008
@@ -135,7 +135,7 @@
#endif
uim_init_key_subrs();
uim_init_rk_subrs();
- uim_init_plugin();
+ uim_init_dynlib();
#ifdef ENABLE_ANTHY_STATIC
uim_anthy_plugin_instance_init();
#endif
@@ -170,7 +170,6 @@
return;
}
- uim_quit_plugin();
#ifdef ENABLE_ANTHY_STATIC
uim_anthy_plugin_instance_quit();
#endif
@@ -180,6 +179,8 @@
#if UIM_USE_NOTIFY
uim_notify_quit();
#endif
+ uim_scm_callf("module-unload-all", "");
+ uim_quit_dynlib();
uim_scm_quit();
uim_initialized = UIM_FALSE;
}