Bug#48327: Some crashes specific to FreeBSD ("embedded")
Backport fixes from ndb: Rework the constructors of some static object's to not call dbug functions since the constructors will be called before main, and consequently, before the dbug library is initialized.
This commit is contained in:
parent
dbb643d64e
commit
ce78970202
@ -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