[DEV] start rework remove object
This commit is contained in:
parent
4c68791bdd
commit
03336135d6
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user