~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_plugin.cc

Merged with trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
521
521
}
522
522
 
523
523
 
524
 
static plugin_ref intern_plugin_lock(LEX *lex, plugin_ref rc)
 
524
static plugin_ref intern_plugin_lock(LEX *, plugin_ref rc)
525
525
{
526
526
  st_plugin_int *pi= plugin_ref_to_int(rc);
527
527
 
539
539
    *plugin= pi;
540
540
    pi->ref_count++;
541
541
 
542
 
    if (lex)
543
 
      insert_dynamic(&lex->plugins, (unsigned char*)&plugin);
544
542
    return(plugin);
545
543
  }
546
544
  return(NULL);
725
723
  size_t count;
726
724
  uint32_t idx;
727
725
  struct st_plugin_int *plugin;
728
 
  vector<st_plugin_int *> reap;
729
 
  vector<st_plugin_int *>::reverse_iterator riter;
730
 
 
731
 
  if (!reap_needed)
732
 
    return;
733
 
 
734
726
 
735
727
  reap_needed= false;
736
728
  count= plugin_array.elements;
737
 
  reap.reserve(count);
738
729
 
739
730
  for (idx= 0; idx < count; idx++)
740
731
  {
741
732
    plugin= *dynamic_element(&plugin_array, idx, struct st_plugin_int **);
742
 
    if (plugin->state == PLUGIN_IS_DELETED && !plugin->ref_count)
743
 
    {
744
 
      /* change the status flag to prevent reaping by another thread */
745
 
      plugin->state= PLUGIN_IS_DYING;
746
 
      reap.push_back(plugin);
747
 
    }
748
 
  }
749
 
 
750
 
  for (riter= reap.rbegin(); plugin= *riter, riter != reap.rend(); riter++)
 
733
    plugin->state= PLUGIN_IS_DYING;
751
734
    plugin_deinitialize(plugin, true);
752
 
 
753
 
  for (riter= reap.rbegin(); plugin= *riter, riter != reap.rend(); riter++)
754
735
    plugin_del(plugin);
755
 
 
 
736
  }
756
737
}
757
738
 
758
 
static void intern_plugin_unlock(LEX *lex, plugin_ref plugin)
 
739
static void intern_plugin_unlock(LEX *, plugin_ref plugin)
759
740
{
760
 
  int i;
761
741
  st_plugin_int *pi;
762
742
 
763
743
  if (!plugin)
767
747
 
768
748
  free((void *) plugin);
769
749
 
770
 
  if (lex)
771
 
  {
772
 
    /*
773
 
      Remove one instance of this plugin from the use list.
774
 
      We are searching backwards so that plugins locked last
775
 
      could be unlocked faster - optimizing for LIFO semantics.
776
 
    */
777
 
    for (i= lex->plugins.elements - 1; i >= 0; i--)
778
 
      if (plugin == *dynamic_element(&lex->plugins, i, plugin_ref*))
779
 
      {
780
 
        delete_dynamic_element(&lex->plugins, i);
781
 
        break;
782
 
      }
783
 
    assert(i >= 0);
784
 
  }
785
 
 
786
750
  assert(pi->ref_count);
787
751
  pi->ref_count--;
788
752
 
913
877
  struct st_mysql_plugin **builtins;
914
878
  struct st_mysql_plugin *plugin;
915
879
  struct st_plugin_int tmp, *plugin_ptr;
916
 
  vector<st_plugin_int *> reap;
917
 
  vector<st_plugin_int *>::reverse_iterator riter;
918
880
  MEM_ROOT tmp_root;
919
881
 
920
882
  if (initialized)
995
957
  /*
996
958
    Now we initialize all remaining plugins
997
959
  */
998
 
  reap.reserve(plugin_array.elements);
999
 
 
1000
960
  for (idx= 0; idx < plugin_array.elements; idx++)
1001
961
  {
1002
962
    plugin_ptr= *dynamic_element(&plugin_array, idx, struct st_plugin_int **);
1005
965
      if (plugin_initialize(plugin_ptr))
1006
966
      {
1007
967
        plugin_ptr->state= PLUGIN_IS_DYING;
1008
 
        reap[idx]= plugin_ptr;
 
968
        plugin_deinitialize(plugin_ptr, true);
 
969
        plugin_del(plugin_ptr);
1009
970
      }
1010
971
    }
1011
972
  }
1012
973
 
1013
 
  /*
1014
 
    Check if any plugins have to be reaped
1015
 
  */
1016
 
  for(riter= reap.rbegin();
1017
 
      plugin_ptr= *riter, riter != reap.rend();
1018
 
      riter++)
1019
 
  {
1020
 
    plugin_deinitialize(plugin_ptr, true);
1021
 
    plugin_del(plugin_ptr);
1022
 
  }
1023
974
 
1024
975
end:
1025
976
  free_root(&tmp_root, MYF(0));
2014
1965
 
2015
1966
void plugin_sessionvar_cleanup(Session *session)
2016
1967
{
2017
 
  uint32_t idx;
2018
 
  plugin_ref *list;
2019
 
 
2020
1968
  unlock_variables(session, &session->variables);
2021
1969
  cleanup_variables(session, &session->variables);
2022
 
 
2023
 
  if ((idx= session->lex->plugins.elements))
2024
 
  {
2025
 
    list= ((plugin_ref*) session->lex->plugins.buffer) + idx - 1;
2026
 
    while ((unsigned char*) list >= session->lex->plugins.buffer)
2027
 
      intern_plugin_unlock(NULL, *list--);
2028
 
  }
2029
 
 
2030
 
  reset_dynamic(&session->lex->plugins);
2031
 
 
2032
 
  return;
2033
1970
}
2034
1971
 
2035
1972