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

Reply via email to