Add logic about device presence timeout handle.
authorjyong2.kim <jyong2.kim@samsung.com>
Wed, 15 Jul 2015 10:32:58 +0000 (19:32 +0900)
committerUze Choi <uzchoi@samsung.com>
Wed, 15 Jul 2015 13:14:22 +0000 (13:14 +0000)
add device presence timeout.
add changing presence mode.
change to definition value for time.
add definition value for timer.

Change-Id: Ia631d18774d1684207b6bc87cbd8010af8a1a3bd
Signed-off-by: jyong2.kim <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/1668
Reviewed-by: Hun-je Yeon <hunje.yeon@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
service/resource-manipulation/src/resourceBroker/include/BrokerTypes.h
service/resource-manipulation/src/resourceBroker/include/DevicePresence.h
service/resource-manipulation/src/resourceBroker/include/ResourcePresence.h
service/resource-manipulation/src/resourceBroker/src/DevicePresence.cpp
service/resource-manipulation/src/resourceBroker/src/ResourcePresence.cpp

index 08caa99..8c400d8 100755 (executable)
@@ -33,8 +33,9 @@ namespace OIC
     namespace Service
     {
         #define BROKER_TAG PCF("BROKER")
-        #define SAFE_MILLISECOND (5000l)
-        #define SAFE_SECOND (5l)
+        #define BROKER_DEVICE_PRESENCE_TIMEROUT (15000l)
+        #define BROKER_SAFE_SECOND (5l)
+        #define BROKER_SAFE_MILLISECOND (BROKER_SAFE_SECOND * (1000))
         #define BROKER_TRANSPORT OCConnectivityType::CT_ADAPTER_IP
 
         /*
@@ -110,7 +111,7 @@ namespace OIC
                 const std::string&)> SubscribeCB;
 
         typedef std::function<void(const HeaderOptions&, const ResponseStatement&, int)> RequestGetCB;
-        typedef std::function<void * (unsigned int)> TimeoutCB;
+        typedef std::function<void*(long long)> TimerCB;
     } // namespace Service
 } // namespace OIC
 
index 6a48357..06a1a02 100755 (executable)
@@ -27,6 +27,7 @@
 #include "BrokerTypes.h"
 #include "ResourcePresence.h"
 #include "PresenceSubscriber.h"
+#include "ExpiryTimer.h"
 
 namespace OIC
 {
@@ -35,6 +36,8 @@ namespace OIC
         class DevicePresence
         {
         public:
+            using TimerID = long long;
+
             DevicePresence();
             ~DevicePresence();
 
@@ -47,19 +50,24 @@ namespace OIC
             const std::string getAddress() const;
 
         private:
-            void requestAllResourcePresence();
-            void subscribeCB(OCStackResult ret,const unsigned int seq, const std::string& Hostaddress);
-            void * timeOutCB(unsigned int msg);
-
             std::list<ResourcePresence * > resourcePresenceList;
 
             std::string address;
-            DEVICE_STATE state;
-            bool isWithinTime;
+            std::atomic<DEVICE_STATE> state;
+            std::atomic_bool isRunningTimeOut;
 
+            std::mutex timeoutMutex;
+            std::condition_variable condition;
+
+            ExpiryTimer presenceTimer;
+            TimerID presenceTimerHandle;
+            TimerCB pTimeoutCB;
             SubscribeCB pSubscribeRequestCB;
-            TimeoutCB pTimeoutCB;
             PresenceSubscriber presenceSubscriber;
+
+            void changeAllPresenceMode(BROKER_MODE mode);
+            void subscribeCB(OCStackResult ret,const unsigned int seq, const std::string& Hostaddress);
+            void * timeOutCB(TimerID id);
         };
     } // namespace Service
 } // namespace OIC
index d12416f..48b799c 100755 (executable)
@@ -71,8 +71,8 @@ namespace OIC
             unsigned int timeoutHandle;
 
             RequestGetCB pGetCB;
-            TimeoutCB pTimeoutCB;
-            TimeoutCB pPollingCB;
+            TimerCB pTimeoutCB;
+            TimerCB pPollingCB;
 
             void registerDevicePresence();
             void getCB(const HeaderOptions &hos, const ResponseStatement& rep, int eCode);
index 2f45bbc..277f580 100755 (executable)
@@ -28,7 +28,10 @@ namespace OIC
         DevicePresence::DevicePresence()
         {
             state = DEVICE_STATE::REQUESTED;
-            isWithinTime = true;
+
+            presenceTimerHandle = 0;
+            isRunningTimeOut = false;
+
             pSubscribeRequestCB = std::bind(&DevicePresence::subscribeCB, this,
                         std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
             pTimeoutCB = std::bind(&DevicePresence::timeOutCB, this, std::placeholders::_1);
@@ -36,7 +39,12 @@ namespace OIC
 
         DevicePresence::~DevicePresence()
         {
+            if(presenceSubscriber.isSubscribing())
+            {
+                presenceSubscriber.unsubscribe();
+            }
             resourcePresenceList.clear();
+            presenceTimer.destroyTimer();
         }
 
         void DevicePresence::initializeDevicePresence(PrimitiveResourcePtr pResource)
@@ -49,7 +57,6 @@ namespace OIC
             {
                 presenceSubscriber
                 = PresenceSubscriber(pResource->getHost(), BROKER_TRANSPORT, pSubscribeRequestCB);
-
                 OC_LOG_V(DEBUG, BROKER_TAG, "subscribe Presence");
             } catch(PlatformException &e)
             {
@@ -57,7 +64,8 @@ namespace OIC
                         "exception in subscribe Presence %s", e.getReason().c_str());
                 throw;
             }
-            //TODO generate Timer(if(!isTimer))
+            presenceTimerHandle
+            = presenceTimer.postTimer(BROKER_DEVICE_PRESENCE_TIMEROUT, pTimeoutCB);
         }
 
         const std::string DevicePresence::getAddress() const
@@ -75,11 +83,14 @@ namespace OIC
             resourcePresenceList.remove(rPresence);
         }
 
-        void DevicePresence::requestAllResourcePresence()
+        void DevicePresence::changeAllPresenceMode(BROKER_MODE mode)
         {
-            for(auto it : resourcePresenceList)
+            if(!resourcePresenceList.empty())
             {
-                it->requestResourceState();
+                for(auto it : resourcePresenceList)
+                {
+                    it->changePresenceMode(mode);
+                }
             }
         }
 
@@ -94,70 +105,61 @@ namespace OIC
             OC_LOG_V(DEBUG, BROKER_TAG, "Received presence CB from: %s",hostAddress.c_str());
             OC_LOG_V(DEBUG, BROKER_TAG, "In subscribeCB: %d",ret);
 
-            if(isWithinTime)
+            if(isRunningTimeOut)
             {
-                switch(ret)
-                {
-                    case OC_STACK_OK:
-                    case OC_STACK_RESOURCE_CREATED:
-                    case OC_STACK_CONTINUE:
-                        OC_LOG_V(DEBUG, BROKER_TAG, "SEQ# %d",seq);
-                        state = DEVICE_STATE::ALIVE;
-                        OC_LOG_V(DEBUG, BROKER_TAG, "device state : %d",(int)state);
-                        if(!resourcePresenceList.empty())
-                        {
-                            requestAllResourcePresence();
-                        }
-                        break;
-
-                    case OC_STACK_INVALID_REQUEST_HANDLE:
-                    case OC_STACK_RESOURCE_DELETED:
-                    case OC_STACK_TIMEOUT:
-                    case OC_STACK_COMM_ERROR:
-                        //TODO get request
-                        state = DEVICE_STATE::REQUESTED;
-                        if(!resourcePresenceList.empty())
-                        {
-                            OC_LOG_V(DEBUG, BROKER_TAG,
-                                    "ready to execute requestAllResourcePresence()");
-                            requestAllResourcePresence();
-                        }
-                        break;
-
-                    case OC_STACK_PRESENCE_STOPPED:
-                    case OC_STACK_PRESENCE_TIMEOUT:
-                        OC_LOG_V(DEBUG, BROKER_TAG, "Server Presence Stop!!");
-                        state = DEVICE_STATE::LOST_SIGNAL;
-                        requestAllResourcePresence();
-                        break;
-
-                    case OC_STACK_PRESENCE_DO_NOT_HANDLE:
-                        OC_LOG_V(DEBUG, BROKER_TAG, "Presence Lost Signal because do not handled");
-                        state = DEVICE_STATE::LOST_SIGNAL;
-                        requestAllResourcePresence();
-                        break;
-
-                    default:
-                        OC_LOG_V(DEBUG, BROKER_TAG, "Presence Lost Signal because unknown type");
-                        state = DEVICE_STATE::LOST_SIGNAL;
-                        requestAllResourcePresence();
-                        break;
-                }
+                std::unique_lock<std::mutex> lock(timeoutMutex);
+                condition.wait(lock);
             }
-            else
+            presenceTimer.cancelTimer(presenceTimerHandle);
+
+            switch(ret)
             {
-                OC_LOG_V(DEBUG, BROKER_TAG, "This response is Timeout but device steel alive");
-                this->state = DEVICE_STATE::ALIVE;
-                isWithinTime = true;
+                case OC_STACK_OK:
+                case OC_STACK_RESOURCE_CREATED:
+                case OC_STACK_CONTINUE:
+                {
+                    OC_LOG_V(DEBUG, BROKER_TAG, "SEQ# %d",seq);
+                    state = DEVICE_STATE::ALIVE;
+                    OC_LOG_V(DEBUG, BROKER_TAG, "device state : %d",(int)state);
+                    changeAllPresenceMode(BROKER_MODE::DEVICE_PRESENCE_MODE);
+                    presenceTimerHandle
+                    = presenceTimer.postTimer(BROKER_DEVICE_PRESENCE_TIMEROUT, pTimeoutCB);
+                    break;
+                }
+                case OC_STACK_INVALID_REQUEST_HANDLE:
+                case OC_STACK_RESOURCE_DELETED:
+                case OC_STACK_TIMEOUT:
+                case OC_STACK_COMM_ERROR:
+                case OC_STACK_PRESENCE_STOPPED:
+                case OC_STACK_PRESENCE_TIMEOUT:
+                case OC_STACK_PRESENCE_DO_NOT_HANDLE:
+                {
+                    state = DEVICE_STATE::LOST_SIGNAL;
+                    changeAllPresenceMode(BROKER_MODE::NON_PRESENCE_MODE);
+                    break;
+                }
+                default:
+                {
+                    OC_LOG_V(DEBUG, BROKER_TAG, "Presence Lost Signal because unknown type");
+                    state = DEVICE_STATE::LOST_SIGNAL;
+                    changeAllPresenceMode(BROKER_MODE::NON_PRESENCE_MODE);
+                    break;
+                }
             }
         }
 
-        void * DevicePresence::timeOutCB(unsigned int msg)
+        void * DevicePresence::timeOutCB(TimerID id)
         {
-            this->isWithinTime = false;
+            std::unique_lock<std::mutex> lock(timeoutMutex);
+            isRunningTimeOut = true;
+
             OC_LOG_V(DEBUG, BROKER_TAG,
                     "Timeout execution. will be discard after receiving cb message");
             state = DEVICE_STATE::LOST_SIGNAL;
+            changeAllPresenceMode(BROKER_MODE::NON_PRESENCE_MODE);
+
+            isRunningTimeOut = false;
+            condition.notify_all();
 
             return NULL;
         }
index 54bb9b4..926eb4d 100755 (executable)
@@ -61,7 +61,7 @@ namespace OIC
             = std::unique_ptr<std::list<BrokerRequesterInfoPtr>>
             (new std::list<BrokerRequesterInfoPtr>);
 
-            timeoutHandle = expiryTimer.postTimer(SAFE_MILLISECOND, pTimeoutCB);
+            timeoutHandle = expiryTimer.postTimer(BROKER_SAFE_MILLISECOND, pTimeoutCB);
 
             primitiveResource->requestGet(pGetCB);
 
@@ -187,7 +187,7 @@ namespace OIC
             currentTime += 0L;
 
             if((receivedTime.load(std::memory_order_relaxed) == 0) ||
-              ((receivedTime + SAFE_SECOND) > currentTime ))
+              ((receivedTime + BROKER_SAFE_SECOND) > currentTime ))
             {
                 this->isWithinTime = false;
                 isTimeoutCB = false;
@@ -212,7 +212,7 @@ namespace OIC
         {
             OC_LOG_V(DEBUG,BROKER_TAG,"IN PollingCB\n");
             this->requestResourceState();
-            timeoutHandle = expiryTimer.postTimer(SAFE_MILLISECOND,pTimeoutCB);
+            timeoutHandle = expiryTimer.postTimer(BROKER_SAFE_MILLISECOND,pTimeoutCB);
 
             return NULL;
         }
@@ -243,7 +243,7 @@ namespace OIC
             if(mode == BROKER_MODE::NON_PRESENCE_MODE)
             {
                 // TODO set timer & request get
-                expiryTimer.postTimer(SAFE_MILLISECOND,pPollingCB);
+                expiryTimer.postTimer(BROKER_SAFE_MILLISECOND,pPollingCB);
             }
 
         }
@@ -290,8 +290,10 @@ namespace OIC
         {
             if(newMode != mode)
             {
+                expiryTimer.cancelTimer(timeoutHandle);
                 if(newMode == BROKER_MODE::NON_PRESENCE_MODE)
                 {
+                    timeoutHandle = expiryTimer.postTimer(BROKER_SAFE_MILLISECOND,pTimeoutCB);
                     requestResourceState();
                 }
                 mode = newMode;