[DEBUG] track an android access memory error

This commit is contained in:
Edouard DUPIN 2013-12-20 00:34:00 +01:00
parent 504dc26fa6
commit 28bf683bbf
12 changed files with 61 additions and 25 deletions

2
build

@ -1 +1 @@
Subproject commit f52e3e6f5e20c2dc24fe4838af8b843270feeb13
Subproject commit 397f9eb1241bc87c5c4df4412e76b92fd87c93e4

2
external/etk vendored

@ -1 +1 @@
Subproject commit 923319e6f7d62bcd5be6d7b7ef391bb0a3ce2645
Subproject commit 91198bd19564c6aa44f81c27d8fc380b65eedd92

View File

@ -228,8 +228,8 @@ void ewol::compositing::Image::printPart(const vec2& _size,
void ewol::compositing::Image::setSource(const std::string& _newFile, const vec2& _size) {
clear();
// remove old one
ewol::resource::TextureFile::release(m_resource);
ewol::resource::TextureFile* resource = m_resource;
m_resource = NULL;
ivec2 tmpSize(_size.x(),_size.y());
// note that no image can be loaded...
if (_newFile != "") {
@ -239,10 +239,20 @@ void ewol::compositing::Image::setSource(const std::string& _newFile, const vec2
EWOL_ERROR("Can not get Image resource");
}
}
if (m_resource == NULL) {
if (resource != NULL) {
EWOL_WARNING("Retrive previous resource");
m_resource = resource;
}
} else {
if (resource != NULL) {
ewol::resource::TextureFile::release(resource);
}
}
}
bool ewol::compositing::Image::hasSources(void) {
return m_resource!=NULL;
return m_resource != NULL;
}

View File

@ -97,12 +97,15 @@ int32_t ewol::object::Manager::getNumberObject(void) {
void ewol::object::Manager::informOneObjectIsRemoved(ewol::Object* _object) {
for (size_t iii=0; iii<m_eObjectList.size(); iii++) {
if (m_eObjectList[iii] != NULL) {
EWOL_DEBUG("inform " << iii << "/" << m_eObjectList.size());
EWOL_DEBUG(" named '" << m_eObjectList[iii]->getName() << "' type=" << m_eObjectList[iii]->getObjectType());
m_eObjectList[iii]->onObjectRemove(_object);
}
}
for (size_t iii=0; iii<m_eObjectAutoRemoveList.size(); iii++) {
if( m_eObjectAutoRemoveList[iii] != NULL
&& m_eObjectAutoRemoveList[iii] != _object) {
EWOL_DEBUG("inform2 " << iii << "/" << m_eObjectList.size());
m_eObjectAutoRemoveList[iii]->onObjectRemove(_object);
}
}
@ -149,6 +152,7 @@ void ewol::object::Manager::autoRemove(ewol::Object* _object) {
informOneObjectIsRemoved(_object);
m_eObjectAutoRemoveList.push_back(_object);
ewol::getContext().forceRedrawAll();
EWOL_DEBUG("Auto-Remove Object ... done");
return;
}
}
@ -159,7 +163,7 @@ void ewol::object::Manager::autoRemove(ewol::Object* _object) {
void ewol::object::Manager::removeAllAutoRemove(void) {
//EWOL_DEBUG("Auto-Remove Object section : " << m_eObjectAutoRemoveList.size() << " elemeents");
while(0<m_eObjectAutoRemoveList.size()) {
if (m_eObjectAutoRemoveList[0]!=NULL) {
if (m_eObjectAutoRemoveList[0] != NULL) {
EWOL_DEBUG("Real Auto-Remove Object type=\"" << m_eObjectAutoRemoveList[0]->getObjectType() << "\"");
delete(m_eObjectAutoRemoveList[0]);
m_eObjectAutoRemoveList[0] = NULL;

View File

@ -19,13 +19,15 @@
ewol::resource::TextureFile::TextureFile(const std::string& _genName) :
Texture(_genName) {
EWOL_DEBUG("create a new resource::Image : _genName=" << _genName << " _tmpfileName=--- size=---");
}
ewol::resource::TextureFile::TextureFile(std::string _genName, const std::string& _tmpfileName, const ivec2& _size) :
ewol::resource::Texture(_genName) {
addObjectType("ewol::compositing::TextureFile");
addObjectType("ewol::resource::Image");
EWOL_DEBUG("create a new resource::Image : _genName=" << _genName << " _tmpfileName=" << _tmpfileName << " size=" << _size);
if (false == egami::load(m_data, _tmpfileName, _size)) {
EWOL_ERROR("ERROR when loading the image : " << _tmpfileName);
}

View File

@ -23,7 +23,7 @@ namespace ewol {
private:
TextureFile(const std::string& _genName);
TextureFile(std::string _genName, const std::string& _fileName, const ivec2& _size);
~TextureFile(void) { };
virtual ~TextureFile(void) { };
public:
const vec2& getRealSize(void) {
return m_realImageSize;

View File

@ -195,15 +195,17 @@ bool ewol::resource::Manager::release(ewol::Resource*& _object) {
if(m_resourceList[iii] != _object) {
continue;
}
// insidiously remove the pointer for the caller ...
_object = NULL;
if (true == m_resourceList[iii]->decrement()) {
// delete element
delete(m_resourceList[iii]);
if (m_resourceList[iii]->decrement() == true) {
// remove element from the list :
m_resourceList[iii] = NULL;
// delete element
_object->removeObject();
// insidiously remove the pointer for the caller ...
_object = NULL;
return true; // object really removed
}
// insidiously remove the pointer for the caller ...
_object = NULL;
return false; // just decrement ...
}
EWOL_ERROR("Can not find the resources in the list : " << (int64_t)_object);
@ -211,3 +213,19 @@ bool ewol::resource::Manager::release(ewol::Resource*& _object) {
_object = NULL;
return false;
}
// in case of error ...
void ewol::resource::Manager::onObjectRemove(ewol::Object * _removeObject) {
for (size_t iii=0; iii<m_resourceList.size(); ++iii) {
if (m_resourceList[iii] == _removeObject) {
EWOL_WARNING("Remove Resource that is not removed ... ");
m_resourceList[iii] = NULL;
}
}
for (size_t iii=0; iii<m_resourceListToUpdate.size(); ++iii) {
if (m_resourceListToUpdate[iii] == _removeObject) {
EWOL_WARNING("Remove Resource that is not removed .2. ");
m_resourceListToUpdate[iii] = NULL;
}
}
}

View File

@ -67,6 +67,8 @@ namespace ewol {
* @return true, if element is removed, and false for just decreasing counter
*/
bool release(ewol::Resource*& _object);
public: // herited function
virtual void onObjectRemove(ewol::Object * _removeObject);
};
};
};

View File

@ -35,7 +35,7 @@ static int32_t nextP2(int32_t _value) {
ewol::resource::Texture::Texture(const std::string& _filename) :
ewol::Resource(_filename) {
addObjectType("ewol::compositing::Texture");
addObjectType("ewol::resource::Texture");
m_loaded = false;
m_texId = 0;
m_endPointSize.setValue(1.0,1.0);

View File

@ -171,7 +171,7 @@ ewol::Widget* ewol::widget::ContainerN::getWidgetNamed(const std::string& _widge
}
void ewol::widget::ContainerN::onObjectRemove(ewol::Object* _removeObject) {
// First step call parrent :
// First step call parrent :
ewol::Widget::onObjectRemove(_removeObject);
// second step find if in all the elements ...
for (int64_t iii=m_subWidget.size()-1; iii >= 0; iii--) {

View File

@ -238,7 +238,7 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) {
ewol::widget::Windows* currentWindows = getWindows();
if (NULL == currentWindows) {
EWOL_ERROR("Can not get the curent Windows...");
delete(m_widgetContextMenu);
m_widgetContextMenu->removeObject();
m_widgetContextMenu=NULL;
} else {
currentWindows->popUpWidgetPush(m_widgetContextMenu);

View File

@ -223,12 +223,12 @@ ewol::widget::FileChooser::FileChooser(void) {
EWOL_ERROR("Can not allocate widget == > display might be in error");
} else {
mySizerVert->subWidgetAdd(mySizerHori);
myImage = new ewol::widget::Image("THEME:GUI:File.svg");
myImage = new ewol::widget::Image("THEME:GUI:File.svg", ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
if (NULL == myImage) {
EWOL_ERROR("Can not allocate widget == > display might be in error");
} else {
myImage->setImageSize(ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
//myImage->setExpand(bvec2(false,true));
//myImage->setImageSize(ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
myImage->setExpand(bvec2(false,false));
mySizerHori->subWidgetAdd(myImage);
}
m_widgetCurrentFileName = new ewol::widget::Entry(m_file);
@ -248,12 +248,12 @@ ewol::widget::FileChooser::FileChooser(void) {
EWOL_ERROR("Can not allocate widget == > display might be in error");
} else {
mySizerVert->subWidgetAdd(mySizerHori);
myImage = new ewol::widget::Image("THEME:GUI:Folder.svg");
myImage = new ewol::widget::Image("THEME:GUI:Folder.svg", ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
if (NULL == myImage) {
EWOL_ERROR("Can not allocate widget == > display might be in error");
} else {
myImage->setImageSize(ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
//myImage->setExpand(bvec2(false,true));
//myImage->setImageSize(ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
myImage->setExpand(bvec2(false,false));
mySizerHori->subWidgetAdd(myImage);
}
@ -268,13 +268,13 @@ ewol::widget::FileChooser::FileChooser(void) {
//m_widgetCurrentFolder->setWidth(200);
mySizerHori->subWidgetAdd(m_widgetCurrentFolder);
}
myImage = new ewol::widget::Image("THEME:GUI:Home.svg");
myImage = new ewol::widget::Image("THEME:GUI:Home.svg", ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
if (NULL == myImage) {
EWOL_ERROR("Can not allocate widget == > display might be in error");
} else {
myImage->setImageSize(ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
//myImage->setImageSize(ewol::Dimension(vec2(8,8),ewol::Dimension::Millimeter));
myImage->registerOnEvent(this, ewol::widget::Image::eventPressed, ewolEventFileChooserHome);
//myImage->setExpand(bvec2(false,true));
myImage->setExpand(bvec2(false,false));
mySizerHori->subWidgetAdd(myImage);
}
}