From: Mu-Woong Lee Date: Tue, 25 Jul 2017 02:24:05 +0000 (+0900) Subject: Implement TriggerStandbyState X-Git-Tag: submit/tizen/20170726.122148^2~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b9b91139ff94d55f6a7725cf9552fa39cd1eaf1c;p=platform%2Fcore%2Fcontext%2Fjob-scheduler.git Implement TriggerStandbyState Change-Id: Iaabcffd256bdabeb84172b7202c66e5d19df833c Signed-off-by: Mu-Woong Lee --- diff --git a/src/server/ContextManager.h b/src/server/ContextManager.h index 25973b8..5ae8f26 100644 --- a/src/server/ContextManager.h +++ b/src/server/ContextManager.h @@ -19,10 +19,11 @@ #include #include -#include "ContextPublisher.h" namespace ctx { + class ContextPublisher; + class ContextManager { public: ~ContextManager(); diff --git a/src/server/ContextPublisher.cpp b/src/server/ContextPublisher.cpp index 378f4d7..6b14243 100644 --- a/src/server/ContextPublisher.cpp +++ b/src/server/ContextPublisher.cpp @@ -44,19 +44,22 @@ ContextPublisher::~ContextPublisher() { } -void ContextPublisher::addObserver(IContextObserver* observer) +void ContextPublisher::addObserver(IContextObserver* observer, void* userData) { if (__observers.empty()) { read(); subscribe(); } - __observers.push_back(observer); + __observers.emplace_back(observer, userData); } void ContextPublisher::removeObserver(IContextObserver* observer) { - __observers.remove(observer); + __observers.remove_if( + [&](const ObserverInfo& info)->bool { + return (info.observer == observer); + }); if (__observers.empty()) { unsubscribe(); @@ -89,8 +92,8 @@ const Json::Value& ContextPublisher::getData() void ContextPublisher::notifyObservers() { - for (auto& observer : __observers) { - observer->ready(); + for (auto& info : __observers) { + info.observer->contextDataReady(this, info.data); } } @@ -103,3 +106,9 @@ void ContextPublisher::clearData() { __data = Json::nullValue; } + +ContextPublisher::ObserverInfo::ObserverInfo(IContextObserver* o, void* d) : + observer(o), + data(d) +{ +} diff --git a/src/server/ContextPublisher.h b/src/server/ContextPublisher.h index aa4afcc..ab40e1a 100644 --- a/src/server/ContextPublisher.h +++ b/src/server/ContextPublisher.h @@ -38,7 +38,7 @@ namespace ctx { public: virtual ~ContextPublisher(); - void addObserver(IContextObserver* observer); + void addObserver(IContextObserver* observer, void* userData); void removeObserver(IContextObserver* observer); virtual const char* getUri() const = 0; @@ -65,7 +65,12 @@ namespace ctx { Json::Value __data; private: - std::list __observers; + struct ObserverInfo { + IContextObserver* observer; + void* data; + ObserverInfo(IContextObserver* o, void* d); + }; + std::list __observers; }; } diff --git a/src/server/IContextObserver.h b/src/server/IContextObserver.h index 2508fad..b06a633 100644 --- a/src/server/IContextObserver.h +++ b/src/server/IContextObserver.h @@ -19,11 +19,13 @@ namespace ctx { + class ContextPublisher; + class IContextObserver { public: virtual ~IContextObserver() {} - virtual void ready() = 0; + virtual void contextDataReady(ContextPublisher* pubs, void* userData) = 0; }; } diff --git a/src/server/JobManager.cpp b/src/server/JobManager.cpp index 3b82c05..50b918e 100644 --- a/src/server/JobManager.cpp +++ b/src/server/JobManager.cpp @@ -19,6 +19,7 @@ #include #include #include "ContextManager.h" +#include "ContextPublisher.h" #include "SchedTimer.h" #include "OnDemandJobRunner.h" #include "PeriodicJobRunner.h" diff --git a/src/server/JobRunner.cpp b/src/server/JobRunner.cpp index 8064248..973a40d 100644 --- a/src/server/JobRunner.cpp +++ b/src/server/JobRunner.cpp @@ -68,16 +68,24 @@ JobInfo* JobRunner::getJobInfo() void JobRunner::setState(JobState* state) { + bool success = false; + delete __state; __state = state; IF_FAIL_VOID(__state); try { - if (__state->execute()) + if ((success = __state->execute())) __state->setClient(__client); } catch (const std::runtime_error& e) { - _E("State transtion failed: %s", e.what()); + _E("State transition failed: %s", e.what()); + _I("Terminating Job-%d of '%s'", getJobId(), getOwner().c_str()); + terminate(); + } + + if (!success) { + _E("State transition failed"); _I("Terminating Job-%d of '%s'", getJobId(), getOwner().c_str()); terminate(); } diff --git a/src/server/JobState.h b/src/server/JobState.h index c1998c8..8f967c2 100644 --- a/src/server/JobState.h +++ b/src/server/JobState.h @@ -22,7 +22,7 @@ #include #define _ENTER _I("ENTER: Job-%d of '%s'", getJobId(), getOwner().c_str()) -#define _EXIT _I("EXIT : Job-%d of '%s'", getJobId(), getOwner().c_str()) +#define _EXIT _D("EXIT : Job-%d of '%s'", getJobId(), getOwner().c_str()) namespace ctx { diff --git a/src/server/TriggerStandbyState.cpp b/src/server/TriggerStandbyState.cpp index ff681cb..288032d 100644 --- a/src/server/TriggerStandbyState.cpp +++ b/src/server/TriggerStandbyState.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#include +#include "ContextManager.h" +#include "ContextPublisher.h" +#include "ReqVerificationState.h" #include "TriggerStandbyState.h" using namespace ctx; @@ -27,11 +31,42 @@ TriggerStandbyState::TriggerStandbyState(JobRunner* runner) : TriggerStandbyState::~TriggerStandbyState() { _EXIT; + __unsubscribe(); } bool TriggerStandbyState::execute() { - //TODO: Subscribe the trigger contexts. - // If a context expires, verify its attributes, and transit to ReqVerificationState. + return __subscribe(); +} + +void TriggerStandbyState::contextDataReady(ContextPublisher* pubs, void* userData) +{ + JobTrigger* trigger = static_cast(userData); + + if (*trigger <= pubs->getData()) + transit(new ReqVerificationState(this)); +} + +bool TriggerStandbyState::__subscribe() +{ + auto& triggers = static_cast(getJobInfo())->getTriggers(); + + for (auto& trg : triggers) { + ContextPublisher* pubs = ContextManager::getPublisher(trg->getUri(), getUid()); + IF_FAIL_RETURN(pubs, false); + + pubs->addObserver(this, trg); + __publishers.push_back(pubs); + } + return true; } + +void TriggerStandbyState::__unsubscribe() +{ + for (auto& pubs : __publishers) { + pubs->removeObserver(this); + } + + __publishers.clear(); +} diff --git a/src/server/TriggerStandbyState.h b/src/server/TriggerStandbyState.h index 3d0e42f..9e5e34b 100644 --- a/src/server/TriggerStandbyState.h +++ b/src/server/TriggerStandbyState.h @@ -17,17 +17,28 @@ #ifndef __CONTEXT_JOB_SCHEDULER_TRIGGER_STANDBY_STATE_H__ #define __CONTEXT_JOB_SCHEDULER_TRIGGER_STANDBY_STATE_H__ +#include #include +#include "IContextObserver.h" #include "JobState.h" namespace ctx { - class TriggerStandbyState : public JobState { + class ContextPublisher; + + class TriggerStandbyState : public JobState, public IContextObserver { public: TriggerStandbyState(JobRunner* runner); ~TriggerStandbyState(); bool execute(); + void contextDataReady(ContextPublisher* pubs, void* userData); + + private: + bool __subscribe(); + void __unsubscribe(); + + std::vector __publishers; }; }