Implement TimerStandbyState 48/139948/2
authorMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 21 Jul 2017 06:32:12 +0000 (15:32 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Fri, 21 Jul 2017 09:37:50 +0000 (18:37 +0900)
Change-Id: I1f3c30054ac644ab2fcf2c7e0c38750d3c1adc14
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
src/server/JobRunner.cpp
src/server/JobRunner.h
src/server/JobState.cpp
src/server/JobState.h
src/shared/Conf.h

index 7232535dda1a099d6978ed5a417600acad6c0101..7671fc70645e19262eef3a71990fb02faddb08aa 100644 (file)
@@ -104,7 +104,8 @@ void JobRunner::jobFinished()
 
 
 PeriodicJobRunner::PeriodicJobRunner(JobManager* mgr, const std::string& owner, JobInfo* info) :
-       JobRunner(mgr, owner, info)
+       JobRunner(mgr, owner, info),
+       __lastScheduledTime(0)
 {
        ++__periodicJobRunnerCnt;
 }
@@ -149,6 +150,16 @@ void PeriodicJobRunner::terminate()
                SchedTimer::reset();
 }
 
+time_t PeriodicJobRunner::getLastTime()
+{
+       return __lastScheduledTime;
+}
+
+void PeriodicJobRunner::setLastTime(time_t t)
+{
+       __lastScheduledTime = t;
+}
+
 
 OnDemandJobRunner::OnDemandJobRunner(JobManager* mgr, const std::string& owner, JobInfo* info) :
        JobRunner(mgr, owner, info)
index dfedcaed0c0d7453d08bdcc83bfdbf50f7aa5e6a..cd7d79d4bc950f6ef758b9cd712e2749070267eb 100644 (file)
@@ -69,7 +69,11 @@ namespace ctx {
                void restart();
                void terminate();
 
+               time_t getLastTime();
+               void setLastTime(time_t t);
+
        private:
+               time_t __lastScheduledTime;
                static unsigned int __periodicJobRunnerCnt;
        };
 
index 7a08ae3f125be23061d8c60c98960fba9da17a2f..ed78e56f3e25f3e47cfe49643e452a268cf23ffd 100644 (file)
  * limitations under the License.
  */
 
+#include <Conf.h>
 #include "JobRunner.h"
 #include "JobState.h"
 
 #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 SEC_PER_MIN    60
+
 using namespace ctx;
 
 unsigned int TimerStandbyState::__timerStandbyStateCnt = 0;
@@ -92,13 +95,12 @@ TimerStandbyState::~TimerStandbyState()
 
 bool TimerStandbyState::execute()
 {
-       //TODO: Set a timer.
-       return true;
+       return __setTimer();
 }
 
 void TimerStandbyState::onSchedTimerExpired()
 {
-       //TODO: Transit to ReqVerificationState.
+       transit(new ReqVerificationState(this));
 }
 
 unsigned int TimerStandbyState::getCount()
@@ -106,6 +108,31 @@ unsigned int TimerStandbyState::getCount()
        return __timerStandbyStateCnt;
 }
 
+bool TimerStandbyState::__setTimer()
+{
+       PeriodicJobRunner* runner = static_cast<PeriodicJobRunner*>(getJobRunner());
+       time_t interval = static_cast<time_t>(static_cast<PeriodicJobInfo*>(getJobInfo())->getInterval()) * SEC_PER_MIN;
+
+       time_t lastTime = [&]()->time_t {
+               if (runner->getLastTime() != 0)
+                       return runner->getLastTime();
+
+               time_t now = time(NULL);
+               time_t anchor = static_cast<PeriodicJobInfo*>(getJobInfo())->getAnchor();
+
+               anchor = anchor % interval;
+               return static_cast<time_t>((now - anchor) / interval) * interval + anchor;
+       }();
+
+       time_t nextTime = lastTime + interval;
+       unsigned int margin = static_cast<double>(interval) * CTX_PERIOD_MARGIN;
+
+       runner->setLastTime(nextTime);
+
+       _I("Set a timer at %ld with %us margin", static_cast<long>(nextTime), margin);
+       return SchedTimer::set(this, nextTime, margin);
+}
+
 
 TriggerStandbyState::TriggerStandbyState(JobRunner* runner) :
        JobState(runner)
index f9eea698b2060584ea11244b75f1a26c509faf9a..95872dd3bb6f81ee8c1d863629c550a1f9b9686f 100644 (file)
@@ -66,6 +66,9 @@ namespace ctx {
                static unsigned int getCount();
 
        private:
+               bool __setTimer();
+
+               time_t __lastExpiredTime;
                static unsigned int __timerStandbyStateCnt;
        };
 
index 52d195f634d2bffa895a12e052d93fcd8ce001d9..7b24cae918a3f2570a9ecf1956146710a2018615 100644 (file)
@@ -21,4 +21,6 @@
 #define CTX_MAX_JOB_PERIOD             1440    // minutes
 #define CTX_MAX_REQ_TIMEOUT            10000   // milli-seconds
 
+#define CTX_PERIOD_MARGIN              0.25    // from 0 to 1
+
 #endif /* __CONTEXT_JOB_SCHEDULER_CONF_H__ */