correction of the segFault bug with Resources

This commit is contained in:
Edouard DUPIN 2012-08-28 10:31:19 +02:00
parent 5d2000e952
commit fd86f42454
4 changed files with 28 additions and 16 deletions

View File

@ -657,6 +657,7 @@ namespace etk
if (requestSize == m_allocated) {
return;
}
//TK_INFO("Change vector allocation : " << m_allocated << "==>" << requestSize);
// check if something is allocated :
if (NULL == m_data) {
// no data allocated ==> request an allocation (might be the first)

View File

@ -41,7 +41,7 @@ namespace ewol
virtual ~Resource(void) { };
virtual bool HasName(etk::UString& fileName)
{
EWOL_DEBUG("check : " << fileName << " ?= " << m_name << " = " << (fileName==m_name) );
EWOL_VERBOSE("G : check : " << fileName << " ?= " << m_name << " = " << (fileName==m_name) );
return fileName==m_name;
};
virtual etk::UString GetName(void) { return m_name; };

View File

@ -56,8 +56,7 @@ void ewol::resource::UnInit(void)
// internal generic keeper ...
static ewol::Resource* LocalKeep(etk::UString& filename)
{
EWOL_DEBUG("KEEP : DEFAULT : file : \"" << filename << "\"");
//for (int32_t iii=l_resourceList.Size()-1; iii>=0; iii--) {
EWOL_VERBOSE("KEEP (DEFAULT) : file : \"" << filename << "\"");
for (int32_t iii=0; iii<l_resourceList.Size(); iii++) {
if (l_resourceList[iii] != NULL) {
if(l_resourceList[iii]->HasName(filename)) {
@ -70,11 +69,23 @@ static ewol::Resource* LocalKeep(etk::UString& filename)
return NULL;
}
// internal generic keeper ...
static void LocalAdd(ewol::Resource* object)
{
EWOL_VERBOSE("Add ... find empty slot");
for (int32_t iii=0; iii<l_resourceList.Size(); iii++) {
if (l_resourceList[iii] == NULL) {
l_resourceList[iii] = object;
return;
}
}
l_resourceList.PushBack(object);
}
// return the type of the resource ...
bool ewol::resource::Keep(etk::UString& filename, ewol::TexturedFont*& object)
{
EWOL_DEBUG("KEEP : TexturedFont : file : \"" << filename << "\"");
EWOL_VERBOSE("KEEP : TexturedFont : file : \"" << filename << "\"");
object = static_cast<ewol::TexturedFont*>(LocalKeep(filename));
if (NULL != object) {
return true;
@ -85,14 +96,14 @@ bool ewol::resource::Keep(etk::UString& filename, ewol::TexturedFont*& object)
EWOL_ERROR("allocation error of a resource : " << filename);
return false;
}
l_resourceList.PushBack(object);
LocalAdd(object);
return true;
}
bool ewol::resource::Keep(etk::UString& filename, ewol::Font*& object)
{
EWOL_DEBUG("KEEP : Font : file : \"" << filename << "\"");
EWOL_VERBOSE("KEEP : Font : file : \"" << filename << "\"");
object = static_cast<ewol::Font*>(LocalKeep(filename));
if (NULL != object) {
return true;
@ -103,14 +114,14 @@ bool ewol::resource::Keep(etk::UString& filename, ewol::Font*& object)
EWOL_ERROR("allocation error of a resource : " << filename);
return false;
}
l_resourceList.PushBack(object);
LocalAdd(object);
return true;
}
bool ewol::resource::Keep(etk::UString& filename, ewol::Program*& object)
{
EWOL_DEBUG("KEEP : Program : file : \"" << filename << "\"");
EWOL_VERBOSE("KEEP : Program : file : \"" << filename << "\"");
object = static_cast<ewol::Program*>(LocalKeep(filename));
if (NULL != object) {
return true;
@ -121,14 +132,14 @@ bool ewol::resource::Keep(etk::UString& filename, ewol::Program*& object)
EWOL_ERROR("allocation error of a resource : " << filename);
return false;
}
l_resourceList.PushBack(object);
LocalAdd(object);
return true;
}
bool ewol::resource::Keep(etk::UString& filename, ewol::Shader*& object)
{
EWOL_DEBUG("KEEP : Shader : file : \"" << filename << "\"");
EWOL_VERBOSE("KEEP : Shader : file : \"" << filename << "\"");
object = static_cast<ewol::Shader*>(LocalKeep(filename));
if (NULL != object) {
return true;
@ -139,7 +150,7 @@ bool ewol::resource::Keep(etk::UString& filename, ewol::Shader*& object)
EWOL_ERROR("allocation error of a resource : " << filename);
return false;
}
l_resourceList.PushBack(object);
LocalAdd(object);
return true;
}
@ -150,6 +161,7 @@ void ewol::resource::Release(ewol::Resource*& object)
EWOL_ERROR("Try to remove a resource that have null pointer ...");
return;
}
EWOL_VERBOSE("RELEASE (default) : file : \"" << object->GetName() << "\"");
for (int32_t iii=l_resourceList.Size()-1; iii>=0; iii--) {
if (l_resourceList[iii] != NULL) {
if(l_resourceList[iii] == object) {
@ -157,7 +169,7 @@ void ewol::resource::Release(ewol::Resource*& object)
// delete element
delete(l_resourceList[iii]);
// remove element from the list :
l_resourceList.Erase(iii);
l_resourceList[iii] = NULL;
}
// insidiously remove the pointer for the caller ...
object = NULL;

View File

@ -77,10 +77,9 @@ ewol::TexturedFont::TexturedFont(etk::UString fontName) :
EWOL_CRITICAL("Can not parse the font name : \"" << fontName << "\" ==> size ???");
return;
}
*tmpPos = '\0';
}
m_name = fontName.Extract(0, (tmpPos - tmpData));
m_size = tmpSize;
m_name = tmpData;
//EWOL_CRITICAL("Load FONT name : \"" << m_name << "\" ==> size=" << m_size);
ewol::resource::Keep(m_name, m_font);
if (NULL == m_font) {
@ -214,8 +213,8 @@ bool ewol::TexturedFont::HasName(etk::UString& fileName)
etk::UString tmpName = m_name;
tmpName += ":";
tmpName += m_size;
EWOL_DEBUG("check : " << fileName << " ?= " << tmpName << " = " << (fileName==tmpName) );
return fileName==tmpName;
EWOL_VERBOSE("S : check : " << fileName << " ?= " << tmpName << " = " << (fileName==tmpName) );
return (fileName==tmpName);
}