summaryrefslogtreecommitdiff
path: root/sql/ha_ndbcluster.cc
diff options
context:
space:
mode:
authorunknown <tomas@whalegate.ndb.mysql.com>2007-04-02 18:22:33 +0200
committerunknown <tomas@whalegate.ndb.mysql.com>2007-04-02 18:22:33 +0200
commit64c7c89ac0c3758d3b4026e942c8dbe6b947fbb8 (patch)
treeb1e72d09184d1781361ba44236c73028c3363052 /sql/ha_ndbcluster.cc
parent8aa507edb99a6f24553b9a8f773411327307aa0b (diff)
parentf9315b16b14f662b4d89fffcc39a3b84e6c56b51 (diff)
downloadmariadb-git-64c7c89ac0c3758d3b4026e942c8dbe6b947fbb8.tar.gz
Merge whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-telco-gca
into whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-ndb sql/ha_ndbcluster.cc: Auto merged
Diffstat (limited to 'sql/ha_ndbcluster.cc')
-rw-r--r--sql/ha_ndbcluster.cc35
1 files changed, 25 insertions, 10 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 5c7ba12a5da..a1b907e0e18 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -6695,7 +6695,8 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
DBUG_RETURN(NULL);
}
- List<NDB_SHARE> util_open_tables;
+ uint share_list_size= 0;
+ NDB_SHARE **share_list= NULL;
set_timespec(abstime, 0);
for (;;)
{
@@ -6725,7 +6726,22 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
/* Lock mutex and fill list with pointers to all open tables */
NDB_SHARE *share;
pthread_mutex_lock(&ndbcluster_mutex);
- for (uint i= 0; i < ndbcluster_open_tables.records; i++)
+ uint i, record_count= ndbcluster_open_tables.records;
+ if (share_list_size < record_count)
+ {
+ NDB_SHARE ** new_share_list= new NDB_SHARE * [record_count];
+ if (!new_share_list)
+ {
+ sql_print_warning("ndb util thread: malloc failure, "
+ "query cache not maintained properly");
+ pthread_mutex_unlock(&ndbcluster_mutex);
+ goto next; // At least do not crash
+ }
+ delete [] share_list;
+ share_list_size= record_count;
+ share_list= new_share_list;
+ }
+ for (i= 0; i < record_count; i++)
{
share= (NDB_SHARE *)hash_element(&ndbcluster_open_tables, i);
share->use_count++; /* Make sure the table can't be closed */
@@ -6734,14 +6750,14 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
i, share->table_name, share->use_count));
/* Store pointer to table */
- util_open_tables.push_back(share);
+ share_list[i]= share;
}
pthread_mutex_unlock(&ndbcluster_mutex);
- /* Iterate through the open files list */
- List_iterator_fast<NDB_SHARE> it(util_open_tables);
- while ((share= it++))
+ /* Iterate through the open files list */
+ for (i= 0; i < record_count; i++)
{
+ share= share_list[i];
/* Split tab- and dbname */
char buf[FN_REFLEN];
char *tabname, *db;
@@ -6790,10 +6806,7 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
/* Decrease the use count and possibly free share */
free_share(share);
}
-
- /* Clear the list of open tables */
- util_open_tables.empty();
-
+next:
/* Calculate new time to wake up */
int secs= 0;
int msecs= ndb_cache_check_time;
@@ -6816,6 +6829,8 @@ pthread_handler_t ndb_util_thread_func(void *arg __attribute__((unused)))
}
}
+ if (share_list)
+ delete [] share_list;
thd->cleanup();
delete thd;
delete ndb;