Commit 71681467 authored by unknown's avatar unknown
Browse files

converting plugin states to bitmask to simplify testing.

state_mask argument to plugin_foreach()


sql/sql_show.cc:
  state_mask argument to plugin_foreach()
parent 6e5c98ea
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -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 @@ 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)
@@ -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);
    }
+15 −10
Original line number Diff line number Diff line
@@ -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
+3 −2
Original line number Diff line number Diff line
@@ -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);