diff --git a/include/dap_chain_plugins_list.h b/include/dap_chain_plugins_list.h index c0ae76c19f9dadd27a55991478e33e25736de715..7eec9695ed9afaf09efee441b6c1110854d14831 100644 --- a/include/dap_chain_plugins_list.h +++ b/include/dap_chain_plugins_list.h @@ -31,6 +31,7 @@ dap_chain_plugin_list_module_t* dap_chain_plugins_list_get(); bool dap_chain_plugins_list_check_load_plugins(dap_chain_plugins_list_char_t *list); void dap_chain_plugins_list_add(PyObject *module, const char *name); +void dap_chain_plugins_list_name_del(const char *name); #ifdef __cplusplus extern "C" { diff --git a/python-cellframe b/python-cellframe index 873d35d455186ff621a1515e1f1235e4c194843a..10d968ce8ea69a7a2e05750a8ec0ef5ebba1ceb9 160000 --- a/python-cellframe +++ b/python-cellframe @@ -1 +1 @@ -Subproject commit 873d35d455186ff621a1515e1f1235e4c194843a +Subproject commit 10d968ce8ea69a7a2e05750a8ec0ef5ebba1ceb9 diff --git a/src/dap_chain_plugins.c b/src/dap_chain_plugins.c index 98a8822e77cd30f2b7e3a213245e8bbaba290f36..e3ed1e3e49944ee491c88fb61cca10d904716e9d 100644 --- a/src/dap_chain_plugins.c +++ b/src/dap_chain_plugins.c @@ -36,9 +36,6 @@ int dap_chain_plugins_init(dap_config_t *config){ } return 0; } -void dap_chain_plugins_deinit(){ - Py_Finalize(); -} void dap_chain_plugins_loading(){ log_it(L_NOTICE, "Loading plugins"); @@ -123,3 +120,23 @@ void dap_chain_plugins_load_plugin(const char *dir_path, const char *name){ } } +void dap_chain_plugins_deinit(){ + log_it(L_NOTICE, "Deinit python plugins"); + dap_chain_plugin_list_module_t *plugins = dap_chain_plugins_list_get(); + dap_chain_plugin_list_module_t *plugin; + dap_chain_plugin_list_module_t *tmp; + PyObject *res_int = NULL; + LL_FOREACH_SAFE(plugins, plugin, tmp){ + PyObject *func_deinit = PyObject_GetAttrString(plugin->obj_module, "deinit"); + if (func_deinit != NULL || PyCallable_Check(func_deinit)){ + res_int = PyEval_CallObject(func_deinit, NULL); + } else { + log_it(L_WARNING, "For plugin %s can't callable function deinit", plugin->name); + } + DAP_FREE(plugin->name); + Py_XDECREF(plugin->obj_module); + LL_DELETE(plugins, plugin); + } + Py_Finalize(); +} + diff --git a/src/dap_chain_plugins_list.c b/src/dap_chain_plugins_list.c index 69ef5203523a41c86b66a366e34398512853464c..cac4d70334b147c176f2ea24d351118ebc9fb448 100644 --- a/src/dap_chain_plugins_list.c +++ b/src/dap_chain_plugins_list.c @@ -38,3 +38,20 @@ bool dap_chain_plugins_list_check_load_plugins(dap_chain_plugins_list_char_t *li return true; } +void dap_chain_plugins_list_name_del(const char *name){ + dap_chain_plugin_list_module_t *plugin; + dap_chain_plugin_list_module_t *tmp; + bool plugin_searcging = false; + LL_FOREACH_SAFE(m_dap_chain_plugins_module_list, plugin, tmp){ + if (strcmp(plugin->name, name) == 0){ + DAP_FREE(plugin->name); + Py_XDECREF(plugin->obj_module); + LL_DELETE(m_dap_chain_plugins_module_list, plugin); + plugin_searcging = true; + } + } + if (!plugin_searcging){ + log_it(L_WARNING, "Can't searching plugins %s for delete", name); + } +} +