Fix bug for storage update to provider.
authorKIM JungYong <jyong2.kim@samsung.com>
Mon, 29 Aug 2016 12:20:43 +0000 (21:20 +0900)
committerUze Choi <uzchoi@samsung.com>
Tue, 30 Aug 2016 05:22:20 +0000 (05:22 +0000)
The provider will update two type of information,
one of information is connection information, and others is topic list.
It is problem that whole infomation was updated although just one of information updated.
In this patch, update logic is seperated updating infomation.

Change-Id: I0fe1062791ac43fadadbba04311b903c44678a1e
Signed-off-by: KIM JungYong <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/11047
Reviewed-by: Uze Choi <uzchoi@samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
service/notification/src/consumer/NSConsumerInternalTaskController.c
service/notification/src/consumer/NSConsumerMemoryCache.c

index 7935b92..505d414 100644 (file)
@@ -235,6 +235,13 @@ void NSConsumerHandleProviderDiscovered(NSProvider_internal * provider)
 
     bool isAdded = true;
     bool isSubscribing = false;
+
+    NSProvider_internal * providerCacheDataFromAddr
+        = NSFindProviderFromAddr(provider->connection->addr);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING_V(
+        (providerCacheDataFromAddr == NULL) ? (void *)1 : NULL,
+        NSRemoveProvider_internal(providerCacheDataFromAddr));
+
     NSProvider_internal * providerCacheData = NSProviderCacheFind(provider->providerId);
 
     if (providerCacheData == NULL)
@@ -307,8 +314,17 @@ void NSConsumerHandleSubscribeSucceed(NSProvider_internal * provider)
 {
     NS_VERIFY_NOT_NULL_V(provider);
 
-    NSResult ret = NSProviderCacheUpdate(provider);
-    NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
+    NSCacheList * ProviderCache = *(NSGetProviderCacheList());
+
+    NSCacheElement * cacheElement = NSStorageRead(ProviderCache, provider->providerId);
+    NS_VERIFY_NOT_NULL_V(cacheElement);
+    NSProvider_internal * prov = (NSProvider_internal *)cacheElement->data;
+    NSProviderConnectionInfo *infos = prov->connection;
+    while(infos)
+    {
+        infos->isSubscribing = true;
+        infos = infos->next;
+    }
 }
 
 void NSConsumerHandleRecvProviderChanged(NSMessage * msg)
@@ -393,6 +409,9 @@ void NSConsumerHandleRecvTopicLL(NSProvider_internal * provider)
 {
     NS_VERIFY_NOT_NULL_V(provider);
 
+    NSRemoveConnections(provider->connection);
+    provider->connection = NULL;
+
     NSResult ret = NSProviderCacheUpdate(provider);
     NS_VERIFY_NOT_NULL_V(ret == NS_OK ? (void *) 1 : NULL);
 
index 8cbb276..7501958 100644 (file)
@@ -291,20 +291,31 @@ NSResult NSConsumerCacheWriteProvider(NSCacheList * list, NSCacheElement * newOb
     NSProvider_internal * newProvObj = (NSProvider_internal *) newObj->data;
 
     NSCacheElement * it = NSStorageRead(list, newProvObj->providerId);
+
     pthread_mutex_lock(mutex);
 
     if (it)
     {
-        NSProvider_internal * provObj = (NSProvider_internal *) it->data;
+        if (newProvObj->connection)
+        {
+            NSProvider_internal * provObj = (NSProvider_internal *) it->data;
+
+            NSProviderConnectionInfo * infos = provObj->connection;
+            NSProviderConnectionInfo * lastConn = infos->next;
+            while(lastConn)
+            {
+                infos = lastConn;
+                lastConn = lastConn->next;
+            }
+            infos->next = NSCopyProviderConnections(newProvObj->connection);
+        }
 
-        NSProviderConnectionInfo * infos = provObj->connection;
-        NSProviderConnectionInfo * lastConn = infos->next;
-        while(lastConn)
+        if (newProvObj->topicLL)
         {
-            infos = lastConn;
-            lastConn = lastConn->next;
+            NSProvider_internal * provObj = (NSProvider_internal *) it->data;
+            NSRemoveTopicLL(provObj->topicLL);
+            provObj->topicLL = NSCopyTopicLL(newProvObj->topicLL);
         }
-        infos->next = NSCopyProviderConnections(newProvObj->connection);
 
         pthread_mutex_unlock(mutex);