Modify resourceCache codes to synchronize the cacheDataList and to avoid retransmission
authorYounghyunJoo <yh_.joo@samsung.com>
Fri, 31 Jul 2015 10:14:38 +0000 (19:14 +0900)
committerHabib Virji <habib.virji@samsung.com>
Fri, 31 Jul 2015 10:53:43 +0000 (10:53 +0000)
- add std::mutex for synchronization of cacheDataList valuable
- add lastSequenceNum valuable to avoid retransmission

Change-Id: I19cc85084d916b91f359ca116e1b3ef69db2150b
Signed-off-by: YounghyunJoo <yh_.joo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2019
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Habib Virji <habib.virji@samsung.com>
Tested-by: Habib Virji <habib.virji@samsung.com>
service/resource-encapsulation/src/resourceCache/include/DataCache.h
service/resource-encapsulation/src/resourceCache/include/ResourceCacheManager.h
service/resource-encapsulation/src/resourceCache/src/DataCache.cpp
service/resource-encapsulation/src/resourceCache/src/ResourceCacheManager.cpp

index 820960a..bf18718 100644 (file)
@@ -78,6 +78,8 @@ namespace OIC
                 TimerCB pTimerCB;
                 TimerCB pPollingCB;
 
+                unsigned int lastSequenceNum;
+
             public:
                 void onObserve(const HeaderOptions &_hos,
                                const ResponseStatement &_rep, int _result, int _seq);
index 45c1aee..7deb7df 100644 (file)
@@ -61,6 +61,7 @@ namespace OIC
 
             private:
                 static ResourceCacheManager *s_instance;
+                static std::mutex s_mutex;
                 static std::mutex s_mutexForCreation;
                 static std::unique_ptr<std::list<DataCachePtr>> s_cacheDataList;
                 std::map<CacheID, DataCachePtr> cacheIDmap;
index 4def52c..ce91ebe 100644 (file)
@@ -87,6 +87,7 @@ namespace OIC
 
             networkTimeOutHandle = 0;
             pollingHandle = 0;
+            lastSequenceNum = 0;
         }
 
         DataCache::~DataCache()
@@ -199,10 +200,14 @@ namespace OIC
             const HeaderOptions &_hos, const ResponseStatement &_rep, int _result, int _seq)
         {
 
-            if (_result != OC_STACK_OK || _rep.getAttributes().empty())
+            if (_result != OC_STACK_OK || _rep.getAttributes().empty() || lastSequenceNum > _seq)
             {
                 return;
             }
+            else
+            {
+                lastSequenceNum = _seq;
+            }
 
             if (state != CACHE_STATE::READY)
             {
index e60f31e..f6724ee 100644 (file)
@@ -26,10 +26,12 @@ namespace OIC
     {
         ResourceCacheManager *ResourceCacheManager::s_instance = NULL;
         std::mutex ResourceCacheManager::s_mutexForCreation;
+        std::mutex ResourceCacheManager::s_mutex;
         std::unique_ptr<std::list<DataCachePtr>> ResourceCacheManager::s_cacheDataList(nullptr);
 
         ResourceCacheManager::~ResourceCacheManager()
         {
+            std::lock_guard<std::mutex> lock(s_mutex);
             if (s_cacheDataList != nullptr)
             {
                 s_cacheDataList->clear();
@@ -78,6 +80,7 @@ namespace OIC
             DataCachePtr newHandler = findDataCache(pResource);
             if (newHandler == nullptr)
             {
+                std::lock_guard<std::mutex> lock(s_mutex);
                 newHandler.reset(new DataCache());
                 newHandler->initializeDataCache(pResource);
                 s_cacheDataList->push_back(newHandler);
@@ -104,6 +107,7 @@ namespace OIC
                 {
                     cacheIDmap.erase(id);
                 }
+                std::lock_guard<std::mutex> lock(s_mutex);
                 if (foundCacheHandler->isEmptySubscriber())
                 {
                     s_cacheDataList->remove(foundCacheHandler);
@@ -127,6 +131,7 @@ namespace OIC
             }
             foundCache->requestGet();
         }
+
         void ResourceCacheManager::updateResourceCache(CacheID updateId) const
         {
             if (updateId == 0)
@@ -206,6 +211,7 @@ namespace OIC
 
         void ResourceCacheManager::initializeResourceCacheManager()
         {
+            std::lock_guard<std::mutex> lock(s_mutex);
             if (s_cacheDataList == nullptr)
             {
                 s_cacheDataList
@@ -216,6 +222,7 @@ namespace OIC
         DataCachePtr ResourceCacheManager::findDataCache(PrimitiveResourcePtr pResource) const
         {
             DataCachePtr retHandler = nullptr;
+            std::lock_guard<std::mutex> lock(s_mutex);
             for (auto &i : * s_cacheDataList)
             {
                 if (i->getPrimitiveResource()->getUri() == pResource->getUri() &&