From e07ea34f740742aba235cd9eb700ba753f3993ea Mon Sep 17 00:00:00 2001 From: "jyong2.kim" Date: Wed, 15 Jul 2015 19:32:58 +0900 Subject: [PATCH] Add logic about device presence timeout handle. 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 Reviewed-on: https://gerrit.iotivity.org/gerrit/1668 Reviewed-by: Hun-je Yeon Tested-by: jenkins-iotivity Reviewed-by: Uze Choi --- .../src/resourceBroker/include/BrokerTypes.h | 7 +- .../src/resourceBroker/include/DevicePresence.h | 22 ++-- .../src/resourceBroker/include/ResourcePresence.h | 4 +- .../src/resourceBroker/src/DevicePresence.cpp | 122 +++++++++++---------- .../src/resourceBroker/src/ResourcePresence.cpp | 10 +- 5 files changed, 89 insertions(+), 76 deletions(-) diff --git a/service/resource-manipulation/src/resourceBroker/include/BrokerTypes.h b/service/resource-manipulation/src/resourceBroker/include/BrokerTypes.h index 08caa99..8c400d8 100755 --- a/service/resource-manipulation/src/resourceBroker/include/BrokerTypes.h +++ b/service/resource-manipulation/src/resourceBroker/include/BrokerTypes.h @@ -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 RequestGetCB; - typedef std::function TimeoutCB; + typedef std::function TimerCB; } // namespace Service } // namespace OIC diff --git a/service/resource-manipulation/src/resourceBroker/include/DevicePresence.h b/service/resource-manipulation/src/resourceBroker/include/DevicePresence.h index 6a48357..06a1a02 100755 --- a/service/resource-manipulation/src/resourceBroker/include/DevicePresence.h +++ b/service/resource-manipulation/src/resourceBroker/include/DevicePresence.h @@ -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 resourcePresenceList; std::string address; - DEVICE_STATE state; - bool isWithinTime; + std::atomic 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 diff --git a/service/resource-manipulation/src/resourceBroker/include/ResourcePresence.h b/service/resource-manipulation/src/resourceBroker/include/ResourcePresence.h index d12416f..48b799c 100755 --- a/service/resource-manipulation/src/resourceBroker/include/ResourcePresence.h +++ b/service/resource-manipulation/src/resourceBroker/include/ResourcePresence.h @@ -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); diff --git a/service/resource-manipulation/src/resourceBroker/src/DevicePresence.cpp b/service/resource-manipulation/src/resourceBroker/src/DevicePresence.cpp index 2f45bbc..277f580 100755 --- a/service/resource-manipulation/src/resourceBroker/src/DevicePresence.cpp +++ b/service/resource-manipulation/src/resourceBroker/src/DevicePresence.cpp @@ -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 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 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; } diff --git a/service/resource-manipulation/src/resourceBroker/src/ResourcePresence.cpp b/service/resource-manipulation/src/resourceBroker/src/ResourcePresence.cpp index 54bb9b4..926eb4d 100755 --- a/service/resource-manipulation/src/resourceBroker/src/ResourcePresence.cpp +++ b/service/resource-manipulation/src/resourceBroker/src/ResourcePresence.cpp @@ -61,7 +61,7 @@ namespace OIC = std::unique_ptr> (new std::list); - 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; -- 2.7.4