null+****@clear*****
null+****@clear*****
2011年 3月 30日 (水) 20:05:43 JST
Daijiro MORI 2011-03-30 11:05:43 +0000 (Wed, 30 Mar 2011) New Revision: f3cee5f9a281a1095a5e51b500c0cd2337ed9785 Log: fixed a bug ref #894 Modified files: lib/plugin.c lib/plugin_in.h Modified: lib/plugin.c (+7 -1) =================================================================== --- lib/plugin.c 2011-03-28 02:50:42 +0000 (adfb72a) +++ lib/plugin.c 2011-03-30 11:05:43 +0000 (37fc45b) @@ -147,6 +147,9 @@ grn_plugin_open(grn_ctx *ctx, const char *filename) if ((id = grn_hash_get(ctx, grn_plugins, filename, PATHLEN(filename), (void **)&plugin))) { + if (plugin && *plugin) { + (*plugin)->refcount++; + } return id; } if ((dl = grn_dl_open(filename))) { @@ -171,6 +174,8 @@ grn_plugin_open(grn_ctx *ctx, const char *filename) SERR(label); } id = GRN_ID_NIL; + } else { + (*plugin)->refcount = 1; } } else { if (!grn_dl_close(dl)) { @@ -192,10 +197,11 @@ grn_plugin_close(grn_ctx *ctx, grn_id id) { grn_plugin *plugin; - grn_plugin_call_fin(ctx, id); if (!grn_hash_get_value(ctx, grn_plugins, id, &plugin)) { return GRN_INVALID_ARGUMENT; } + if (--plugin->refcount) { return GRN_SUCCESS; } + grn_plugin_call_fin(ctx, id); if (!grn_dl_close(plugin->dl)) { const char *label; label = grn_dl_close_error_label; Modified: lib/plugin_in.h (+1 -0) =================================================================== --- lib/plugin_in.h 2011-03-28 02:50:42 +0000 (bc64998) +++ lib/plugin_in.h 2011-03-30 11:05:43 +0000 (aa6dc6f) @@ -50,6 +50,7 @@ struct _grn_plugin { grn_plugin_func register_func; grn_plugin_func unregister_func; grn_plugin_func fin_func; + int refcount; }; grn_rc grn_plugins_init(void);