grn_rc grn_plugin_close(grn_ctx *ctx, grn_id id) { grn_rc rc; grn_plugin *plugin; if (id == GRN_ID_NIL) { return GRN_INVALID_ARGUMENT; } CRITICAL_SECTION_ENTER(grn_plugins_lock); if (!grn_hash_get_value(&grn_gctx, grn_plugins, id, &plugin)) { rc = GRN_INVALID_ARGUMENT; goto exit; } if (--plugin->refcount) { rc = GRN_SUCCESS; goto exit; } if (plugin->dl) { grn_plugin_call_fin(ctx, id); if (!grn_dl_close(plugin->dl)) { const char *label; label = grn_dl_close_error_label(); SERR("%s", label); } } GRN_GFREE(plugin); rc = grn_hash_delete_by_id(&grn_gctx, grn_plugins, id, NULL); exit: CRITICAL_SECTION_LEAVE(grn_plugins_lock); return rc; }
grn_rc grn_plugin_close(grn_ctx *ctx, grn_id id) { grn_plugin *plugin; 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; SERR(label); } GRN_GFREE(plugin); return grn_hash_delete_by_id(ctx, grn_plugins, id, NULL); }