summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/sql_plugin.cc16
-rw-r--r--sql/sql_plugin.h25
-rw-r--r--sql/sql_show.cc5
3 files changed, 27 insertions, 19 deletions
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index 8ed16d8af58..b66d2d20925 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -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;
@@ -943,13 +943,15 @@ err:
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)
@@ -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;
}
@@ -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;
}
@@ -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);
}
diff --git a/sql/sql_plugin.h b/sql/sql_plugin.h
index ed7ba36ac84..fa3440f7f68 100644
--- a/sql/sql_plugin.h
+++ b/sql/sql_plugin.h
@@ -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. */
@@ -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 */
};
@@ -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
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index a8bf2695ac4..3acc025b84f 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -220,9 +220,10 @@ 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);
}