Merge of mysql-5.1-bugteam into mysql-trunk-merge.
This commit is contained in:
commit
dbf41f9fbc
@ -24,36 +24,31 @@ NdbMutex* NdbMutex_Create(void)
|
|||||||
{
|
{
|
||||||
NdbMutex* pNdbMutex;
|
NdbMutex* pNdbMutex;
|
||||||
int result;
|
int result;
|
||||||
DBUG_ENTER("NdbMutex_Create");
|
|
||||||
|
|
||||||
pNdbMutex = (NdbMutex*)NdbMem_Allocate(sizeof(NdbMutex));
|
pNdbMutex = (NdbMutex*)NdbMem_Allocate(sizeof(NdbMutex));
|
||||||
DBUG_PRINT("info",("NdbMem_Allocate 0x%lx", (long) pNdbMutex));
|
|
||||||
|
|
||||||
if (pNdbMutex == NULL)
|
if (pNdbMutex == NULL)
|
||||||
DBUG_RETURN(NULL);
|
return NULL;
|
||||||
|
|
||||||
result = pthread_mutex_init(pNdbMutex, NULL);
|
result = pthread_mutex_init(pNdbMutex, NULL);
|
||||||
assert(result == 0);
|
assert(result == 0);
|
||||||
|
|
||||||
DBUG_RETURN(pNdbMutex);
|
return pNdbMutex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int NdbMutex_Destroy(NdbMutex* p_mutex)
|
int NdbMutex_Destroy(NdbMutex* p_mutex)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
DBUG_ENTER("NdbMutex_Destroy");
|
|
||||||
|
|
||||||
if (p_mutex == NULL)
|
if (p_mutex == NULL)
|
||||||
DBUG_RETURN(-1);
|
return -1;
|
||||||
|
|
||||||
result = pthread_mutex_destroy(p_mutex);
|
result = pthread_mutex_destroy(p_mutex);
|
||||||
|
|
||||||
DBUG_PRINT("info",("NdbMem_Free 0x%lx", (long) p_mutex));
|
|
||||||
NdbMem_Free(p_mutex);
|
NdbMem_Free(p_mutex);
|
||||||
|
|
||||||
DBUG_RETURN(result);
|
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,8 +20,10 @@
|
|||||||
#include <NdbCondition.h>
|
#include <NdbCondition.h>
|
||||||
#include <NdbSleep.h>
|
#include <NdbSleep.h>
|
||||||
|
|
||||||
static NdbTableImpl f_invalid_table;
|
static NdbTableImpl * f_invalid_table = 0;
|
||||||
static NdbTableImpl f_altered_table;
|
static NdbTableImpl * f_altered_table = 0;
|
||||||
|
|
||||||
|
static int ndb_dict_cache_count = 0;
|
||||||
|
|
||||||
Ndb_local_table_info *
|
Ndb_local_table_info *
|
||||||
Ndb_local_table_info::create(NdbTableImpl *table_impl, Uint32 sz)
|
Ndb_local_table_info::create(NdbTableImpl *table_impl, Uint32 sz)
|
||||||
@ -93,11 +95,29 @@ GlobalDictCache::GlobalDictCache(){
|
|||||||
DBUG_ENTER("GlobalDictCache::GlobalDictCache");
|
DBUG_ENTER("GlobalDictCache::GlobalDictCache");
|
||||||
m_tableHash.createHashTable();
|
m_tableHash.createHashTable();
|
||||||
m_waitForTableCondition = NdbCondition_Create();
|
m_waitForTableCondition = NdbCondition_Create();
|
||||||
|
if (f_invalid_table == NULL)
|
||||||
|
f_invalid_table = new NdbTableImpl();
|
||||||
|
if (f_altered_table == NULL)
|
||||||
|
f_altered_table = new NdbTableImpl();
|
||||||
|
ndb_dict_cache_count++;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalDictCache::~GlobalDictCache(){
|
GlobalDictCache::~GlobalDictCache(){
|
||||||
DBUG_ENTER("GlobalDictCache::~GlobalDictCache");
|
DBUG_ENTER("GlobalDictCache::~GlobalDictCache");
|
||||||
|
if (--ndb_dict_cache_count == 0)
|
||||||
|
{
|
||||||
|
if (f_invalid_table)
|
||||||
|
{
|
||||||
|
delete f_invalid_table;
|
||||||
|
f_invalid_table = 0;
|
||||||
|
}
|
||||||
|
if (f_altered_table)
|
||||||
|
{
|
||||||
|
delete f_altered_table;
|
||||||
|
f_altered_table = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
NdbElement_t<Vector<TableVersion> > * curr = m_tableHash.getNext(0);
|
NdbElement_t<Vector<TableVersion> > * curr = m_tableHash.getNext(0);
|
||||||
while(curr != 0){
|
while(curr != 0){
|
||||||
Vector<TableVersion> * vers = curr->theData;
|
Vector<TableVersion> * vers = curr->theData;
|
||||||
@ -254,7 +274,7 @@ GlobalDictCache::put(const char * name, NdbTableImpl * tab)
|
|||||||
TableVersion & ver = vers->back();
|
TableVersion & ver = vers->back();
|
||||||
if(ver.m_status != RETREIVING ||
|
if(ver.m_status != RETREIVING ||
|
||||||
!(ver.m_impl == 0 ||
|
!(ver.m_impl == 0 ||
|
||||||
ver.m_impl == &f_invalid_table || ver.m_impl == &f_altered_table) ||
|
ver.m_impl == f_invalid_table || ver.m_impl == f_altered_table) ||
|
||||||
ver.m_version != 0 ||
|
ver.m_version != 0 ||
|
||||||
ver.m_refCount == 0){
|
ver.m_refCount == 0){
|
||||||
abort();
|
abort();
|
||||||
@ -271,7 +291,7 @@ GlobalDictCache::put(const char * name, NdbTableImpl * tab)
|
|||||||
ver.m_version = tab->m_version;
|
ver.m_version = tab->m_version;
|
||||||
ver.m_status = OK;
|
ver.m_status = OK;
|
||||||
}
|
}
|
||||||
else if (ver.m_impl == &f_invalid_table)
|
else if (ver.m_impl == f_invalid_table)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Table DROPPED invalid"));
|
DBUG_PRINT("info", ("Table DROPPED invalid"));
|
||||||
ver.m_impl = tab;
|
ver.m_impl = tab;
|
||||||
@ -279,7 +299,7 @@ GlobalDictCache::put(const char * name, NdbTableImpl * tab)
|
|||||||
ver.m_status = DROPPED;
|
ver.m_status = DROPPED;
|
||||||
ver.m_impl->m_status = NdbDictionary::Object::Invalid;
|
ver.m_impl->m_status = NdbDictionary::Object::Invalid;
|
||||||
}
|
}
|
||||||
else if(ver.m_impl == &f_altered_table)
|
else if(ver.m_impl == f_altered_table)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Table DROPPED altered"));
|
DBUG_PRINT("info", ("Table DROPPED altered"));
|
||||||
ver.m_impl = tab;
|
ver.m_impl = tab;
|
||||||
@ -440,7 +460,7 @@ GlobalDictCache::alter_table_rep(const char * name,
|
|||||||
|
|
||||||
if(i == sz - 1 && ver.m_status == RETREIVING)
|
if(i == sz - 1 && ver.m_status == RETREIVING)
|
||||||
{
|
{
|
||||||
ver.m_impl = altered ? &f_altered_table : &f_invalid_table;
|
ver.m_impl = altered ? f_altered_table : f_invalid_table;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user