[DEV] start rework remove object

This commit is contained in:
Edouard DUPIN 2014-05-19 07:41:52 +02:00
parent 4c68791bdd
commit 03336135d6
4 changed files with 74 additions and 31 deletions

View File

@ -89,6 +89,41 @@ void ewol::object::Manager::add(const ewol::object::Shared<ewol::Object>& _objec
m_eObjectList.push_back(_object); m_eObjectList.push_back(_object);
} }
void ewol::object::Manager::rm(const ewol::object::Shared<ewol::Object>& _object) {
if (_object == nullptr) {
EWOL_ERROR("Try to remove (nullptr) Object");
return;
}
for (size_t iii=0; iii<m_eObjectList.size(); iii++) {
if (m_eObjectList[iii] == _object) {
// remove Element
m_eObjectList[iii] = nullptr;
m_eObjectList.erase(m_eObjectList.begin()+iii);
informOneObjectIsRemoved(_object);
return;
}
}
// check if the object has not been auto removed ... or remove in defered time ...
for (size_t iii=0; iii<m_eObjectAutoRemoveList.size(); iii++) {
if( m_eObjectAutoRemoveList[iii] != nullptr
&& m_eObjectAutoRemoveList[iii] == _object) {
return;
}
}
// in this case, we have an error ...
EWOL_ERROR("Try to remove Object that is not referenced ...");
}
void ewol::object::Manager::addOwned(const ewol::object::Shared<ewol::Object>& _object) {
// What I need to do ...
}
void ewol::object::Manager::rmOwned(const ewol::object::Shared<ewol::Object>& _object) {
// What I need to do ...
}
int32_t ewol::object::Manager::getNumberObject() { int32_t ewol::object::Manager::getNumberObject() {
return m_eObjectList.size() + m_eObjectAutoRemoveList.size(); return m_eObjectList.size() + m_eObjectAutoRemoveList.size();
} }
@ -125,29 +160,8 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared<
ewol::getContext().onObjectRemove(_object); ewol::getContext().onObjectRemove(_object);
} }
void ewol::object::Manager::rm(const ewol::object::Shared<ewol::Object>& _object) { void ewol::object::Manager::autoRespown(const ewol::object::Shared<ewol::Object>& _object){
if (_object == nullptr) {
EWOL_ERROR("Try to remove (nullptr) Object");
return;
}
for (size_t iii=0; iii<m_eObjectList.size(); iii++) {
if (m_eObjectList[iii] == _object) {
// remove Element
m_eObjectList[iii] = nullptr;
m_eObjectList.erase(m_eObjectList.begin()+iii);
informOneObjectIsRemoved(_object);
return;
}
}
// check if the object has not been auto removed ... or remove in defered time ...
for (size_t iii=0; iii<m_eObjectAutoRemoveList.size(); iii++) {
if( m_eObjectAutoRemoveList[iii] != nullptr
&& m_eObjectAutoRemoveList[iii] == _object) {
return;
}
}
// in this case, we have an error ...
EWOL_ERROR("Try to remove Object that is not referenced ...");
} }
void ewol::object::Manager::autoRemove(const ewol::object::Shared<ewol::Object>& _object) { void ewol::object::Manager::autoRemove(const ewol::object::Shared<ewol::Object>& _object) {

View File

@ -29,9 +29,12 @@ namespace ewol {
void add(const ewol::object::Shared<ewol::Object>& _object); void add(const ewol::object::Shared<ewol::Object>& _object);
void rm(const ewol::object::Shared<ewol::Object>& _object); void rm(const ewol::object::Shared<ewol::Object>& _object);
void addOwned(const ewol::object::Shared<ewol::Object>& _object);
void rmOwned(const ewol::object::Shared<ewol::Object>& _object);
int32_t getNumberObject(); int32_t getNumberObject();
void autoRemove(const ewol::object::Shared<ewol::Object>& _object); void autoRemove(const ewol::object::Shared<ewol::Object>& _object);
void autoRespown(const ewol::object::Shared<ewol::Object>& _object);
void removeAllAutoRemove(); void removeAllAutoRemove();
ewol::object::Shared<ewol::Object> get(const std::string& _name); ewol::object::Shared<ewol::Object> get(const std::string& _name);

View File

@ -38,12 +38,14 @@ bool ewol::Object::setRefOwner(bool _haveOwner) {
return false;; return false;;
} }
m_hasReferenceOwner = true; m_hasReferenceOwner = true;
getObjectManager().addOwned(this);
return true; return true;
} }
if (m_hasReferenceOwner == false) { if (m_hasReferenceOwner == false) {
EWOL_CRITICAL("Object have already NO owner"); EWOL_CRITICAL("Object have already NO owner");
return false; return false;
} }
getObjectManager().rmOwned(this);
m_hasReferenceOwner = false; m_hasReferenceOwner = false;
return true; return true;
} }
@ -68,6 +70,31 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) {
::operator delete(_ptr); ::operator delete(_ptr);
} }
void ewol::Object::autoDestroy() {
std::unique_lock<std::mutex> lock(m_lockRefCount);
if (m_isDestroyed == true) {
EWOL_WARNING("Request remove of a removed object");
return;
}
m_isDestroyed = true;
getObjectManager().autoRemove(this);
}
void ewol::Object::removeObject() {
autoDestroy();
}
void respownObject() {
std::unique_lock<std::mutex> lock(m_lockRefCount);
if (m_isDestroyed == false) {
EWOL_WARNING("Respawn an alive object");
return;
}
m_isDestroyed = false;
getObjectManager().autoRespown(this);
}
ewol::Object::Object() : ewol::Object::Object() :
@ -143,14 +170,6 @@ bool ewol::Object::isTypeCompatible(const std::string& _type) {
return false; return false;
} }
void ewol::Object::autoDestroy() {
getObjectManager().autoRemove(this);
}
void ewol::Object::removeObject() {
getObjectManager().autoRemove(this);
}
void ewol::Object::addEventId(const char * _generateEventId) { void ewol::Object::addEventId(const char * _generateEventId) {
if (nullptr != _generateEventId) { if (nullptr != _generateEventId) {
m_availlableEventId.push_back(_generateEventId); m_availlableEventId.push_back(_generateEventId);

View File

@ -93,6 +93,8 @@ namespace ewol {
* @brief Destructor * @brief Destructor
*/ */
virtual ~Object(); virtual ~Object();
private:
bool m_isDestroyed;
protected: protected:
/** /**
* @brief Auto-destroy the object * @brief Auto-destroy the object
@ -103,6 +105,11 @@ namespace ewol {
* @brief Asynchronous removing the object * @brief Asynchronous removing the object
*/ */
void removeObject(); void removeObject();
public:
/**
* @brief Respown a removed object
*/
void respownObject();
private: private:
std::vector<const char*> m_listType; std::vector<const char*> m_listType;
public: public: