mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
converting plugin states to bitmask to simplify testing.
state_mask argument to plugin_foreach()
This commit is contained in:
parent
29acac81cf
commit
fa98e9c718
3 changed files with 27 additions and 19 deletions
|
@ -372,7 +372,7 @@ struct st_plugin_int *plugin_lock(const LEX_STRING *name, int type)
|
||||||
rw_wrlock(&THR_LOCK_plugin);
|
rw_wrlock(&THR_LOCK_plugin);
|
||||||
if ((rc= plugin_find_internal(name, type)))
|
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++;
|
rc->ref_count++;
|
||||||
else
|
else
|
||||||
rc= 0;
|
rc= 0;
|
||||||
|
@ -943,13 +943,15 @@ err:
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
my_bool plugin_foreach(THD *thd, plugin_foreach_func *func,
|
my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
|
||||||
int type, void *arg)
|
int type, uint state_mask, void *arg)
|
||||||
{
|
{
|
||||||
uint idx, total;
|
uint idx, total;
|
||||||
struct st_plugin_int *plugin, **plugins;
|
struct st_plugin_int *plugin, **plugins;
|
||||||
int version=plugin_array_version;
|
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);
|
rw_rdlock(&THR_LOCK_plugin);
|
||||||
if (type == MYSQL_ANY_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++)
|
for (idx= 0; idx < total; idx++)
|
||||||
{
|
{
|
||||||
plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *);
|
plugin= dynamic_element(&plugin_array, idx, struct st_plugin_int *);
|
||||||
if (plugin->state == PLUGIN_IS_FREED)
|
if (plugin->state & state_mask)
|
||||||
continue;
|
continue;
|
||||||
plugins[idx]= plugin;
|
plugins[idx]= plugin;
|
||||||
}
|
}
|
||||||
|
@ -972,7 +974,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func,
|
||||||
for (idx= 0; idx < total; idx++)
|
for (idx= 0; idx < total; idx++)
|
||||||
{
|
{
|
||||||
plugin= (struct st_plugin_int *) hash_element(hash, idx);
|
plugin= (struct st_plugin_int *) hash_element(hash, idx);
|
||||||
if (plugin->state == PLUGIN_IS_FREED)
|
if (plugin->state & state_mask)
|
||||||
continue;
|
continue;
|
||||||
plugins[idx]= plugin;
|
plugins[idx]= plugin;
|
||||||
}
|
}
|
||||||
|
@ -986,7 +988,7 @@ my_bool plugin_foreach(THD *thd, plugin_foreach_func *func,
|
||||||
{
|
{
|
||||||
rw_rdlock(&THR_LOCK_plugin);
|
rw_rdlock(&THR_LOCK_plugin);
|
||||||
for (uint i=idx; i < total; i++)
|
for (uint i=idx; i < total; i++)
|
||||||
if (plugins[i]->state == PLUGIN_IS_FREED)
|
if (plugins[i]->state & state_mask)
|
||||||
plugins[i]=0;
|
plugins[i]=0;
|
||||||
rw_unlock(&THR_LOCK_plugin);
|
rw_unlock(&THR_LOCK_plugin);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,13 +31,17 @@ typedef struct st_mysql_show_var SHOW_VAR;
|
||||||
|
|
||||||
#define MYSQL_ANY_PLUGIN -1
|
#define MYSQL_ANY_PLUGIN -1
|
||||||
|
|
||||||
enum enum_plugin_state
|
/*
|
||||||
{
|
different values of st_plugin_int::state
|
||||||
PLUGIN_IS_FREED= 0,
|
though they look like a bitmap, plugin may only
|
||||||
PLUGIN_IS_DELETED,
|
be in one of those eigenstates, not in a superposition of them :)
|
||||||
PLUGIN_IS_UNINITIALIZED,
|
It's a bitmap, because it makes it easier to test
|
||||||
PLUGIN_IS_READY
|
"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. */
|
/* A handle for the dynamic library containing a plugin or plugins. */
|
||||||
|
|
||||||
|
@ -57,7 +61,7 @@ struct st_plugin_int
|
||||||
LEX_STRING name;
|
LEX_STRING name;
|
||||||
struct st_mysql_plugin *plugin;
|
struct st_mysql_plugin *plugin;
|
||||||
struct st_plugin_dl *plugin_dl;
|
struct st_plugin_dl *plugin_dl;
|
||||||
enum enum_plugin_state state;
|
uint state;
|
||||||
uint ref_count; /* number of threads using the plugin */
|
uint ref_count; /* number of threads using the plugin */
|
||||||
void *data; /* plugin type specific, e.g. handlerton */
|
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,
|
typedef my_bool (plugin_foreach_func)(THD *thd,
|
||||||
st_plugin_int *plugin,
|
st_plugin_int *plugin,
|
||||||
void *arg);
|
void *arg);
|
||||||
extern my_bool plugin_foreach(THD *thd, plugin_foreach_func *func,
|
#define plugin_foreach(A,B,C,D) plugin_foreach_with_mask(A,B,C,PLUGIN_IS_READY,D)
|
||||||
int type, void *arg);
|
extern my_bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
|
||||||
|
int type, uint state_mask, void *arg);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -220,9 +220,10 @@ int fill_plugins(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||||
DBUG_ENTER("fill_plugins");
|
DBUG_ENTER("fill_plugins");
|
||||||
TABLE *table= tables->table;
|
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(1);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue