[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);
}
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() {
return m_eObjectList.size() + m_eObjectAutoRemoveList.size();
}
@ -125,29 +160,8 @@ void ewol::object::Manager::informOneObjectIsRemoved(const ewol::object::Shared<
ewol::getContext().onObjectRemove(_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::autoRespown(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 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();
void autoRemove(const ewol::object::Shared<ewol::Object>& _object);
void autoRespown(const ewol::object::Shared<ewol::Object>& _object);
void removeAllAutoRemove();
ewol::object::Shared<ewol::Object> get(const std::string& _name);

View File

@ -38,12 +38,14 @@ bool ewol::Object::setRefOwner(bool _haveOwner) {
return false;;
}
m_hasReferenceOwner = true;
getObjectManager().addOwned(this);
return true;
}
if (m_hasReferenceOwner == false) {
EWOL_CRITICAL("Object have already NO owner");
return false;
}
getObjectManager().rmOwned(this);
m_hasReferenceOwner = false;
return true;
}
@ -68,6 +70,31 @@ void ewol::Object::operator delete[](void* _ptr, std::size_t _sz) {
::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() :
@ -143,14 +170,6 @@ bool ewol::Object::isTypeCompatible(const std::string& _type) {
return false;
}
void ewol::Object::autoDestroy() {
getObjectManager().autoRemove(this);
}
void ewol::Object::removeObject() {
getObjectManager().autoRemove(this);
}
void ewol::Object::addEventId(const char * _generateEventId) {
if (nullptr != _generateEventId) {
m_availlableEventId.push_back(_generateEventId);

View File

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