Commit 5205078e authored by unknown's avatar unknown
Browse files

Added possibility to detect if libmysqld is restarted

(Needed to check if memory allocated with mysql_once_init() has been freed)



include/my_sys.h:
  Added possibility to detect if libmysqld is restarted
mysys/my_init.c:
  Added possibility to detect if libmysqld is restarted
sql/handler.cc:
  Detect if libmysqld is restarted
  Simple optimization of ha_known_exts()
parent 834d58a6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -214,6 +214,7 @@ extern ulong my_cache_w_requests, my_cache_write, my_cache_r_requests,
		my_cache_read;
extern ulong	my_blocks_used, my_blocks_changed;
extern ulong	my_file_opened,my_stream_opened, my_tmp_file_created;
extern uint	mysys_usage_id;
extern my_bool	my_init_done;

					/* Point to current my_message() */
+4 −3
Original line number Diff line number Diff line
@@ -42,8 +42,8 @@ static void netware_init();
#define netware_init()
#endif


my_bool my_init_done= 0;
uint	mysys_usage_id= 0;              /* Incremented for each my_init() */

static ulong atoi_octal(const char *str)
{
@@ -74,6 +74,7 @@ my_bool my_init(void)
  if (my_init_done)
    return 0;
  my_init_done=1;
  mysys_usage_id++;
#if defined(THREAD) && defined(SAFE_MUTEX)
  safe_mutex_global_init();		/* Must be called early */
#endif
+23 −15
Original line number Diff line number Diff line
@@ -110,6 +110,7 @@ TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
			       tx_isolation_names, NULL};

static TYPELIB known_extensions= {0,"known_exts", NULL, NULL};
uint known_extensions_id= 0;

enum db_type ha_resolve_by_name(const char *name, uint namelen)
{
@@ -1635,6 +1636,7 @@ int handler::index_read_idx(byte * buf, uint index, const byte * key,
  return error;
}


/*
  Returns a list of all known extensions.

@@ -1643,20 +1645,24 @@ int handler::index_read_idx(byte * buf, uint index, const byte * key,
 
  NOTES
    No mutexes, worst case race is a minor surplus memory allocation
    We have to recreate the extension map if mysqld is restarted (for example
    within libmysqld)

  RETURN VALUE
    pointer		pointer to TYPELIB structure
*/

TYPELIB *ha_known_exts(void)
{
  if (!known_extensions.type_names)
  if (!known_extensions.type_names || mysys_usage_id != known_extensions_id)
  {
    show_table_type_st *types;
    List<char> found_exts;
    List_iterator_fast<char> it(found_exts);
    const char *e, **ext;
    const char **ext, *old_ext;

    found_exts.push_back(".db");
    known_extensions_id= mysys_usage_id;
    found_exts.push_back((char*) ".db");
    for (types= sys_table_types; types->type; types++)
    {      
      if (*types->value == SHOW_OPTION_YES)
@@ -1664,11 +1670,12 @@ TYPELIB *ha_known_exts(void)
	handler *file= get_new_handler(0,(enum db_type) types->db_type);
	for (ext= file->bas_ext(); *ext; ext++)
	{
	  while (e=it++) 
	    if (e == *ext)
	  while ((old_ext= it++))
          {
	    if (!strcmp(old_ext, *ext))
	      break;

	  if (!e)
          }
	  if (!old_ext)
	    found_exts.push_back((char *) *ext);

	  it.rewind();
@@ -1677,15 +1684,16 @@ TYPELIB *ha_known_exts(void)
      }
    }
    ext= (const char **) my_once_alloc(sizeof(char *)*
		  (found_exts.elements+1), MYF(MY_WME));
                                       (found_exts.elements+1),
                                       MYF(MY_WME | MY_FAE));
    
    DBUG_ASSERT(ext);
    for (uint i=0; e=it++; i++)
      ext[i]= e;
    ext[found_exts.elements]= 0;
    
    known_extensions.count= found_exts.elements;
    known_extensions.type_names= ext;

    while ((old_ext= it++))
      *ext++= old_ext;
    *ext= 0;
  }
  return &known_extensions;
}