Add destroy function into primitive service timer
authorChaJiwon <jw_wonny.cha@samsung.com>
Thu, 9 Jul 2015 08:08:15 +0000 (17:08 +0900)
committerUze Choi <uzchoi@samsung.com>
Thu, 9 Jul 2015 08:29:47 +0000 (08:29 +0000)
When ExpiryTimer's destructor called, ExpiryTimer requests destroy to ExpiryTimer_impl.
ExpiryTimer_impl makes a decision for destroying instance or not.

Change-Id: Ib93dec7ff76ef96923bf34f5e645a8d0c2b5dfdc
Signed-off-by: ChaJiwon <jw_wonny.cha@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/1593
Reviewed-by: Uze Choi <uzchoi@samsung.com>
Tested-by: Uze Choi <uzchoi@samsung.com>
service/resource-manipulation/modules/common/expiryTimer/src/ExpiryTimer.cpp
service/resource-manipulation/modules/common/expiryTimer/src/ExpiryTimer_Impl.cpp
service/resource-manipulation/modules/common/expiryTimer/src/ExpiryTimer_Impl.h

index e4279b9..97c1e4f 100644 (file)
@@ -34,10 +34,11 @@ ExpiryTimer::~ExpiryTimer()
     {
         timerPtr->cancelTimer(it);
     }
+    timerPtr->destroy();
     mTimerIDList.clear();
 }
 
-ExpiryTimer::TimerID ExpiryTimer::postTimer(long long sec, TimerCB cb)
+ExpiryTimer::TimerID ExpiryTimer::postTimer(DelayMilliSec sec, TimerCB cb)
 {
     TimerID retID = 0;
 
index 99d9a58..053243b 100644 (file)
@@ -25,8 +25,8 @@
 #include <cstdlib>
 #include <utility>
 
-ExpiryTimer_Impl* ExpiryTimer_Impl::s_instance;
-std::once_flag ExpiryTimer_Impl::mflag;
+ExpiryTimer_Impl* ExpiryTimer_Impl::s_instance = nullptr;
+std::once_flag* ExpiryTimer_Impl::mflag = new std::once_flag;
 
 ExpiryTimer_Impl::ExpiryTimer_Impl()
 {
@@ -35,11 +35,29 @@ ExpiryTimer_Impl::ExpiryTimer_Impl()
 
 ExpiryTimer_Impl::~ExpiryTimer_Impl()
 {
+    check.detach();
+    delete mflag;
+    s_instance = nullptr;
+    delete s_instance;
 }
 
+void ExpiryTimer_Impl::destroy()
+{
+    if(mTimerCBList.empty())
+    {
+        try
+        {
+            s_instance->~ExpiryTimer_Impl();
+        }
+        catch(std::exception &e)
+        {
+            std::cout << e.what();
+        }
+    }
+}
 ExpiryTimer_Impl* ExpiryTimer_Impl::getInstance()
 {
-    std::call_once(mflag, [](){ s_instance = new ExpiryTimer_Impl; });
+    std::call_once((*mflag), [](){ s_instance = new ExpiryTimer_Impl(); });
     return s_instance;
 }
 
@@ -47,6 +65,7 @@ ExpiryTimer_Impl::Id ExpiryTimer_Impl::postTimer(DelayMilliSec msec, TimerCb cb)
 {
     Id retID;
     retID = generateID();
+
     milliSeconds delay(msec);
     insertTimerCBInfo(countExpireTime(delay), cb, retID);
 
@@ -55,12 +74,12 @@ ExpiryTimer_Impl::Id ExpiryTimer_Impl::postTimer(DelayMilliSec msec, TimerCb cb)
 
 bool ExpiryTimer_Impl::cancelTimer(Id timerID)
 {
-    std::lock_guard<std::mutex> lockf(m_mutex);
     bool ret = false;
     for(auto it: mTimerCBList)
     {
         if(it.second.m_id == timerID)
         {
+            std::lock_guard<std::mutex> lockf(m_mutex);
             if(mTimerCBList.erase(it.first)!=0)
                 ret = true;
             else
@@ -72,8 +91,8 @@ bool ExpiryTimer_Impl::cancelTimer(Id timerID)
 
 void ExpiryTimer_Impl::insertTimerCBInfo(ExpiredTime msec, TimerCb cb, Id timerID)
 {
-    std::lock_guard<std::mutex> lockf(m_mutex);
     TimerCBInfo newInfo = {timerID, cb};
+    std::lock_guard<std::mutex> lockf(m_mutex);
     mTimerCBList.insert(std::multimap<ExpiredTime, TimerCBInfo>::value_type(msec, newInfo));
     m_cond.notify_all();
 }
@@ -91,6 +110,7 @@ ExpiryTimer_Impl::Id ExpiryTimer_Impl::generateID()
     srand(time(NULL));
     Id retID = rand();
 
+    std::lock_guard<std::mutex> lockf(id_mutex);
     for(std::multimap<ExpiredTime, TimerCBInfo>::iterator it=mTimerCBList.begin(); it!=mTimerCBList.end(); ++it)
      {
        if((*it).second.m_id == retID || retID == 0)
index a5b8a0c..1d54f93 100644 (file)
@@ -21,8 +21,8 @@
 #ifndef _EXPIRY_TIMER_Impl_H_
 #define _EXPIRY_TIMER_Impl_H_
 
-// CHECKER_WAIT_TIME : checker thread waits new request for 10000 seconds
-#define CHECKER_WAIT_TIME 10000
+// CHECKER_WAIT_TIME : checker thread waits new request for 10 seconds
+#define CHECKER_WAIT_TIME 10
 
 #include <iostream>
 #include <functional>
@@ -50,14 +50,15 @@ private:
         TimerCb m_cb;
     };
 
-public:
-   ~ExpiryTimer_Impl();
-
 private:
    ExpiryTimer_Impl();
+   ExpiryTimer_Impl(const ExpiryTimer_Impl&);
+   ExpiryTimer_Impl& operator=(const ExpiryTimer_Impl&);
+   ~ExpiryTimer_Impl();
 
 public:
     static ExpiryTimer_Impl* getInstance();
+    void destroy();
 
     Id postTimer(DelayMilliSec, TimerCb);
     bool cancelTimer(Id);
@@ -75,12 +76,13 @@ private:
 
 private:
    static ExpiryTimer_Impl* s_instance;
-   static std::once_flag mflag;
+   static std::once_flag* mflag;
 
    std::multimap<ExpiredTime, TimerCBInfo> mTimerCBList;
 
    std::thread check;
    std::mutex m_mutex;
+   std::mutex id_mutex;
    std::mutex cond_mutex;
    std::condition_variable m_cond;