From 942b3a155d170418ff458e1ee3cd2d423966218d Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Fri, 12 Sep 2014 21:22:18 +0200 Subject: [PATCH] [DEV] add a worker interface --- sources/ewol/object/Manager.cpp | 23 ++++++++++++++-- sources/ewol/object/Manager.h | 13 +++++++++ sources/ewol/object/Object.h | 2 +- sources/ewol/object/Signal.h | 44 ++++++++++++++++++++++-------- sources/ewol/object/SignalBase.cpp | 1 + sources/ewol/object/SignalBase.h | 1 + sources/ewol/object/Worker.cpp | 34 +++++++++++++++++++++++ sources/ewol/object/Worker.h | 44 ++++++++++++++++++++++++++++++ sources/lutin_ewol.py | 1 + 9 files changed, 148 insertions(+), 15 deletions(-) create mode 100644 sources/ewol/object/Worker.cpp create mode 100644 sources/ewol/object/Worker.h diff --git a/sources/ewol/object/Manager.cpp b/sources/ewol/object/Manager.cpp index 0f062c5a..79d35c3b 100644 --- a/sources/ewol/object/Manager.cpp +++ b/sources/ewol/object/Manager.cpp @@ -21,6 +21,7 @@ ewol::object::Manager::Manager(ewol::Context& _context) : } ewol::object::Manager::~Manager() { + m_workerList.clear(); bool hasError = false; if (m_eObjectList.size()!=0) { EWOL_ERROR("Must not have anymore eObject !!!"); @@ -44,6 +45,10 @@ void ewol::object::Manager::displayListObject() { void ewol::object::Manager::unInit() { EWOL_DEBUG(" == > Un-Init Object-Manager"); + if (m_workerList.size() > 0) { + EWOL_DEBUG(" == > Remove all workers"); + m_workerList.clear(); + } for (auto &it : m_eObjectList) { std::shared_ptr element = it.lock(); if (element != nullptr) { @@ -74,8 +79,7 @@ void ewol::object::Manager::cleanInternalRemoved() { auto it(m_eObjectList.begin()); while (it != m_eObjectList.end()) { if (it->expired() == true) { - m_eObjectList.erase(it); - it = m_eObjectList.begin(); + it = m_eObjectList.erase(it); } else { ++it; } @@ -104,3 +108,18 @@ std::shared_ptr ewol::object::Manager::getObjectNamed(const std::s return ewol::object::Manager::get(_name); } + +void ewol::object::Manager::workerAdd(const std::shared_ptr& _worker) { + m_workerList.push_back(_worker); +} + +void ewol::object::Manager::workerRemove(const std::shared_ptr& _worker) { + auto it(m_workerList.begin()); + while (it != m_workerList.end()) { + if (*it == _worker) { + it = m_workerList.erase(it); + } else { + ++it; + } + } +} \ No newline at end of file diff --git a/sources/ewol/object/Manager.h b/sources/ewol/object/Manager.h index 84f57b5a..8f031b80 100644 --- a/sources/ewol/object/Manager.h +++ b/sources/ewol/object/Manager.h @@ -52,6 +52,19 @@ namespace ewol { * @return the requested object or nullptr */ std::shared_ptr getObjectNamed(const std::string& _name); + private: + std::vector> m_workerList; + public: + /** + * @brief Add a worker on the system list. + * @param[in] _worker Worker to add in the list. + */ + void workerAdd(const std::shared_ptr& _worker); + /** + * @brief Remove a worker on the system list. + * @param[in] _worker Worker to add in the list. + */ + void workerRemove(const std::shared_ptr& _worker); }; }; }; diff --git a/sources/ewol/object/Object.h b/sources/ewol/object/Object.h index 8f083cc4..62911e48 100644 --- a/sources/ewol/object/Object.h +++ b/sources/ewol/object/Object.h @@ -85,7 +85,7 @@ namespace ewol { */ void autoDestroy(); public: - void destroy() { + virtual void destroy() { autoDestroy(); } public: diff --git a/sources/ewol/object/Signal.h b/sources/ewol/object/Signal.h index 1652848c..74758a15 100644 --- a/sources/ewol/object/Signal.h +++ b/sources/ewol/object/Signal.h @@ -72,10 +72,12 @@ namespace ewol { * @param[in] _obj shared pointer on the removing object */ void release(std::shared_ptr _obj) { - for (auto it(m_callerList.begin()) ; it != m_callerList.end(); ++it) { + auto it(m_callerList.begin()); + while(it != m_callerList.end()) { if (it->first.lock() == _obj) { - m_callerList.erase(it); - it = m_callerList.begin(); + it = m_callerList.erase(it); + } else { + ++it; } } } @@ -84,6 +86,15 @@ namespace ewol { * @param[in] _data data to emit */ void emit(const T& _data) { + #ifdef DEBUG + int32_t tmpID = m_uidSignal++; + ewol::Object* srcObject = dynamic_cast(&m_objectLink); + if (srcObject != nullptr) { + EWOL_DEBUG("emit signal{" << tmpID << "} : " << srcObject->getObjectType() << " signal='" << m_name << "' data='" << etk::to_string(_data) << "' to:"); + } else { + EWOL_DEBUG("emit signal{" << tmpID << "} : signal='" << m_name << "' data='" << etk::to_string(_data) << "' to:"); + } + #endif for (auto &it : m_callerList) { std::shared_ptr destObject = it.first.lock(); if (destObject == nullptr) { @@ -92,11 +103,10 @@ namespace ewol { continue; } #ifdef DEBUG - ewol::Object* srcObject = dynamic_cast(&m_objectLink); if (srcObject != nullptr) { - EWOL_DEBUG("emit signal : " << srcObject->getObjectType() << " '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " data='" << etk::to_string(_data) << "'"); + EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType()); } else { - EWOL_DEBUG("emit signal : '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " data='" << etk::to_string(_data) << "'"); + EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType()); } #endif it.second(_data); @@ -157,14 +167,25 @@ namespace ewol { * @param[in] _obj shared pointer on the removing object */ void release(std::shared_ptr _obj) { - for (auto it(m_callerList.begin()) ; it != m_callerList.end(); ++it) { + auto it(m_callerList.begin()); + while(it != m_callerList.end()) { if (it->first.lock() == _obj) { - m_callerList.erase(it); - it = m_callerList.begin(); + it = m_callerList.erase(it); + } else { + ++it; } } } void emit() { + #ifdef DEBUG + int32_t tmpID = m_uidSignal++; + ewol::Object* srcObject = dynamic_cast(&m_objectLink); + if (srcObject != nullptr) { + EWOL_DEBUG("emit signal{" << tmpID << "} : " << srcObject->getObjectType() << " signal='" << m_name << "' BANG!!! to:"); + } else { + EWOL_DEBUG("emit signal{" << tmpID << "} : signal='" << m_name << "' to:"); + } + #endif for (auto &it : m_callerList) { std::shared_ptr destObject = it.first.lock(); if (destObject == nullptr) { @@ -173,11 +194,10 @@ namespace ewol { continue; } #ifdef DEBUG - ewol::Object* srcObject = dynamic_cast(&m_objectLink); if (srcObject != nullptr) { - EWOL_DEBUG("emit signal : " << srcObject->getObjectType() << " '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " BANG!!!"); + EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType()); } else { - EWOL_DEBUG("emit signal : '" << m_name << "' to [" << destObject->getId() << "]" << destObject->getObjectType() << " BANG!!!"); + EWOL_DEBUG(" signal{" << tmpID << "} : [" << destObject->getId() << "]" << destObject->getObjectType()); } #endif it.second(); diff --git a/sources/ewol/object/SignalBase.cpp b/sources/ewol/object/SignalBase.cpp index 11d2aac6..87b1b101 100644 --- a/sources/ewol/object/SignalBase.cpp +++ b/sources/ewol/object/SignalBase.cpp @@ -12,6 +12,7 @@ #include #include +int32_t ewol::object::SignalBase::m_uidSignal = 0; ewol::object::SignalBase::SignalBase(ewol::object::SignalList& _objectLink, const std::string& _name, const std::string& _description) : diff --git a/sources/ewol/object/SignalBase.h b/sources/ewol/object/SignalBase.h index e45b4cac..5e60ddea 100644 --- a/sources/ewol/object/SignalBase.h +++ b/sources/ewol/object/SignalBase.h @@ -21,6 +21,7 @@ namespace ewol { ewol::object::SignalList& m_objectLink; std::string m_name; std::string m_description; + static int32_t m_uidSignal; public: /** * @brief Create a parameter with a specific type. diff --git a/sources/ewol/object/Worker.cpp b/sources/ewol/object/Worker.cpp new file mode 100644 index 00000000..98133f78 --- /dev/null +++ b/sources/ewol/object/Worker.cpp @@ -0,0 +1,34 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#include +#include +#include + +ewol::object::Worker::Worker() { + addObjectType("ewol::Worker"); +} + +void ewol::object::Worker::init() { + ewol::Object::init(); + getObjectManager().workerAdd(shared_from_this()); +} +//! @previous +void ewol::object::Worker::init(const std::string& _name) { + ewol::Object::init(_name); + getObjectManager().workerAdd(shared_from_this()); +} + +ewol::object::Worker::~Worker() { + // nothing to do ... +} + +void ewol::object::Worker::destroy() { + ewol::Object::destroy(); + getObjectManager().workerRemove(shared_from_this()); +} diff --git a/sources/ewol/object/Worker.h b/sources/ewol/object/Worker.h new file mode 100644 index 00000000..392e508d --- /dev/null +++ b/sources/ewol/object/Worker.h @@ -0,0 +1,44 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license APACHE v2.0 (see license file) + */ + +#ifndef __EWOL_WORKER_H__ +#define __EWOL_WORKER_H__ + +#include +#include + +namespace ewol { + namespace object { + /** + * @brief A worker might not been possesed by someone, then the system might keep a pointer on it. + */ + class Worker : public ewol::Object { + protected: + /** + * @brief Constructor. + */ + Worker(); + void init(); + //! @previous + void init(const std::string& _name); + public: + /** + * @brief Factory + */ + DECLARE_FACTORY(Worker); + /** + * @brief Destructor + */ + virtual ~Worker(); + public: + virtual void destroy(); + }; + }; +}; + +#endif diff --git a/sources/lutin_ewol.py b/sources/lutin_ewol.py index c79ddb49..1fbd2d3b 100755 --- a/sources/lutin_ewol.py +++ b/sources/lutin_ewol.py @@ -90,6 +90,7 @@ def create(target): myModule.add_src_file([ 'ewol/object/Manager.cpp', 'ewol/object/Object.cpp', + 'ewol/object/Worker.cpp', 'ewol/object/Parameter.cpp', 'ewol/object/ParameterList.cpp', 'ewol/object/ParamList.cpp',