Loading sql/sql_plugin.cc +9 −7 Original line number Diff line number Diff line Loading @@ -372,7 +372,7 @@ struct st_plugin_int *plugin_lock(const LEX_STRING *name, int type) rw_wrlock(&THR_LOCK_plugin); if ((rc= plugin_find_internal(name, type))) { if (rc->state == PLUGIN_IS_READY || rc->state == PLUGIN_IS_UNINITIALIZED) if (rc->state & (PLUGIN_IS_READY | PLUGIN_IS_UNINITIALIZED)) rc->ref_count++; else rc= 0; Loading Loading @@ -943,13 +943,15 @@ my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name) DBUG_RETURN(TRUE); } my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, int type, void *arg) my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg) { uint idx, total; struct st_plugin_int *plugin, **plugins; int version=plugin_array_version; DBUG_ENTER("plugin_foreach"); DBUG_ENTER("plugin_foreach_with_mask"); state_mask= ~state_mask; // do it only once rw_rdlock(&THR_LOCK_plugin); if (type == MYSQL_ANY_PLUGIN) Loading @@ -959,7 +961,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, for (idx= 0; idx < total; idx++) { plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *); if (plugin->state == PLUGIN_IS_FREED) if (plugin->state & state_mask) continue; plugins[idx]= plugin; } Loading @@ -972,7 +974,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, for (idx= 0; idx < total; idx++) { plugin= (struct st_plugin_int *) hash_element(hash, idx); if (plugin->state == PLUGIN_IS_FREED) if (plugin->state & state_mask) continue; plugins[idx]= plugin; } Loading @@ -986,7 +988,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, { rw_rdlock(&THR_LOCK_plugin); for (uint i=idx; i < total; i++) if (plugins[i]->state == PLUGIN_IS_FREED) if (plugins[i]->state & state_mask) plugins[i]=0; rw_unlock(&THR_LOCK_plugin); } Loading sql/sql_plugin.h +15 −10 Original line number Diff line number Diff line Loading @@ -31,13 +31,17 @@ typedef struct st_mysql_show_var SHOW_VAR; #define MYSQL_ANY_PLUGIN -1 enum enum_plugin_state { PLUGIN_IS_FREED= 0, PLUGIN_IS_DELETED, PLUGIN_IS_UNINITIALIZED, PLUGIN_IS_READY }; /* different values of st_plugin_int::state though they look like a bitmap, plugin may only be in one of those eigenstates, not in a superposition of them :) It's a bitmap, because it makes it easier to test "whether the state is one of those..." */ #define PLUGIN_IS_FREED 1 #define PLUGIN_IS_DELETED 2 #define PLUGIN_IS_UNINITIALIZED 4 #define PLUGIN_IS_READY 8 /* A handle for the dynamic library containing a plugin or plugins. */ Loading @@ -57,7 +61,7 @@ struct st_plugin_int LEX_STRING name; struct st_mysql_plugin *plugin; struct st_plugin_dl *plugin_dl; enum enum_plugin_state state; uint state; uint ref_count; /* number of threads using the plugin */ void *data; /* plugin type specific, e.g. handlerton */ }; Loading @@ -78,6 +82,7 @@ extern my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name); typedef my_bool (plugin_foreach_func)(THD *thd, st_plugin_int *plugin, void *arg); extern my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, int type, void *arg); #define plugin_foreach(A,B,C,D) plugin_foreach_with_mask(A,B,C,PLUGIN_IS_READY,D) extern my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg); #endif sql/sql_show.cc +3 −2 Original line number Diff line number Diff line Loading @@ -220,7 +220,8 @@ int fill_plugins(THD *thd, TABLE_LIST *tables, COND *cond) DBUG_ENTER("fill_plugins"); TABLE *table= tables->table; if (plugin_foreach(thd, show_plugins, MYSQL_ANY_PLUGIN, table)) if (plugin_foreach_with_mask(thd, show_plugins, MYSQL_ANY_PLUGIN, ~PLUGIN_IS_FREED, table)) DBUG_RETURN(1); DBUG_RETURN(0); Loading Loading
sql/sql_plugin.cc +9 −7 Original line number Diff line number Diff line Loading @@ -372,7 +372,7 @@ struct st_plugin_int *plugin_lock(const LEX_STRING *name, int type) rw_wrlock(&THR_LOCK_plugin); if ((rc= plugin_find_internal(name, type))) { if (rc->state == PLUGIN_IS_READY || rc->state == PLUGIN_IS_UNINITIALIZED) if (rc->state & (PLUGIN_IS_READY | PLUGIN_IS_UNINITIALIZED)) rc->ref_count++; else rc= 0; Loading Loading @@ -943,13 +943,15 @@ my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name) DBUG_RETURN(TRUE); } my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, int type, void *arg) my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg) { uint idx, total; struct st_plugin_int *plugin, **plugins; int version=plugin_array_version; DBUG_ENTER("plugin_foreach"); DBUG_ENTER("plugin_foreach_with_mask"); state_mask= ~state_mask; // do it only once rw_rdlock(&THR_LOCK_plugin); if (type == MYSQL_ANY_PLUGIN) Loading @@ -959,7 +961,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, for (idx= 0; idx < total; idx++) { plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *); if (plugin->state == PLUGIN_IS_FREED) if (plugin->state & state_mask) continue; plugins[idx]= plugin; } Loading @@ -972,7 +974,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, for (idx= 0; idx < total; idx++) { plugin= (struct st_plugin_int *) hash_element(hash, idx); if (plugin->state == PLUGIN_IS_FREED) if (plugin->state & state_mask) continue; plugins[idx]= plugin; } Loading @@ -986,7 +988,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, { rw_rdlock(&THR_LOCK_plugin); for (uint i=idx; i < total; i++) if (plugins[i]->state == PLUGIN_IS_FREED) if (plugins[i]->state & state_mask) plugins[i]=0; rw_unlock(&THR_LOCK_plugin); } Loading
sql/sql_plugin.h +15 −10 Original line number Diff line number Diff line Loading @@ -31,13 +31,17 @@ typedef struct st_mysql_show_var SHOW_VAR; #define MYSQL_ANY_PLUGIN -1 enum enum_plugin_state { PLUGIN_IS_FREED= 0, PLUGIN_IS_DELETED, PLUGIN_IS_UNINITIALIZED, PLUGIN_IS_READY }; /* different values of st_plugin_int::state though they look like a bitmap, plugin may only be in one of those eigenstates, not in a superposition of them :) It's a bitmap, because it makes it easier to test "whether the state is one of those..." */ #define PLUGIN_IS_FREED 1 #define PLUGIN_IS_DELETED 2 #define PLUGIN_IS_UNINITIALIZED 4 #define PLUGIN_IS_READY 8 /* A handle for the dynamic library containing a plugin or plugins. */ Loading @@ -57,7 +61,7 @@ struct st_plugin_int LEX_STRING name; struct st_mysql_plugin *plugin; struct st_plugin_dl *plugin_dl; enum enum_plugin_state state; uint state; uint ref_count; /* number of threads using the plugin */ void *data; /* plugin type specific, e.g. handlerton */ }; Loading @@ -78,6 +82,7 @@ extern my_bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name); typedef my_bool (plugin_foreach_func)(THD *thd, st_plugin_int *plugin, void *arg); extern my_bool plugin_foreach(THD *thd, plugin_foreach_func *func, int type, void *arg); #define plugin_foreach(A,B,C,D) plugin_foreach_with_mask(A,B,C,PLUGIN_IS_READY,D) extern my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg); #endif
sql/sql_show.cc +3 −2 Original line number Diff line number Diff line Loading @@ -220,7 +220,8 @@ int fill_plugins(THD *thd, TABLE_LIST *tables, COND *cond) DBUG_ENTER("fill_plugins"); TABLE *table= tables->table; if (plugin_foreach(thd, show_plugins, MYSQL_ANY_PLUGIN, table)) if (plugin_foreach_with_mask(thd, show_plugins, MYSQL_ANY_PLUGIN, ~PLUGIN_IS_FREED, table)) DBUG_RETURN(1); DBUG_RETURN(0); Loading