Bug fix about memory leak.
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderMemoryCache.c
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\r
7 // Licensed under the Apache License, Version 2.0 (the "License");\r
8 // you may not use this file except in compliance with the License.\r
9 // You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 // Unless required by applicable law or agreed to in writing, software\r
14 // distributed under the License is distributed on an "AS IS" BASIS,\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 // See the License for the specific language governing permissions and\r
17 // limitations under the License.\r
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "NSProviderMemoryCache.h"\r
22 #include <string.h>\r
23 \r
24 NSCacheList * NSProviderStorageCreate()\r
25 {\r
26     pthread_mutex_lock(&NSCacheMutex);\r
27     NSCacheList * newList = (NSCacheList *) OICMalloc(sizeof(NSCacheList));\r
28     if (!newList)\r
29     {\r
30         pthread_mutex_unlock(&NSCacheMutex);\r
31         return NULL;\r
32     }\r
33 \r
34     newList->head = newList->tail = NULL;\r
35 \r
36     pthread_mutex_unlock(&NSCacheMutex);\r
37     NS_LOG(DEBUG, "NSCacheCreate");\r
38 \r
39     return newList;\r
40 }\r
41 \r
42 NSCacheElement * NSProviderStorageRead(NSCacheList * list, const char * findId)\r
43 {\r
44     pthread_mutex_lock(&NSCacheMutex);\r
45 \r
46     NS_LOG(DEBUG, "NSCacheRead - IN");\r
47 \r
48     NSCacheElement * iter = list->head;\r
49     NSCacheElement * next = NULL;\r
50     NSCacheType type = list->cacheType;\r
51 \r
52     NS_LOG_V(DEBUG, "Find ID - %s", findId);\r
53 \r
54     while (iter)\r
55     {\r
56         next = iter->next;\r
57 \r
58         if (NSProviderCompareIdCacheData(type, iter->data, findId))\r
59         {\r
60             NS_LOG(DEBUG, "Found in Cache");\r
61             pthread_mutex_unlock(&NSCacheMutex);\r
62             return iter;\r
63         }\r
64 \r
65         iter = next;\r
66     }\r
67 \r
68     NS_LOG(DEBUG, "Not found in Cache");\r
69     NS_LOG(DEBUG, "NSCacheRead - OUT");\r
70     pthread_mutex_unlock(&NSCacheMutex);\r
71 \r
72     return NULL;\r
73 }\r
74 \r
75 NSResult NSCacheUpdateSubScriptionState(NSCacheList * list, char * id, bool state)\r
76 {\r
77     pthread_mutex_lock(&NSCacheMutex);\r
78 \r
79     NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - IN");\r
80 \r
81     if (id == NULL)\r
82     {\r
83         NS_LOG(DEBUG, "id is NULL");\r
84         pthread_mutex_unlock(&NSCacheMutex);\r
85         return NS_ERROR;\r
86     }\r
87 \r
88     NSCacheElement * it = NSProviderStorageRead(list, id);\r
89 \r
90     if (it)\r
91     {\r
92         NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
93         if (strcmp(itData->id, id) == 0)\r
94         {\r
95             NS_LOG(DEBUG, "Update Data - IN");\r
96 \r
97             NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
98             NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
99             NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
100             NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
101             NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);\r
102             NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
103 \r
104             NS_LOG_V(DEBUG, "update state = %d", state);\r
105 \r
106             itData->isWhite = state;\r
107 \r
108             NS_LOG(DEBUG, "Update Data - OUT");\r
109             pthread_mutex_unlock(&NSCacheMutex);\r
110             return NS_OK;\r
111         }\r
112     }\r
113     else\r
114     {\r
115         NS_LOG(DEBUG, "Not Found Data");\r
116     }\r
117 \r
118     NS_LOG(DEBUG, "NSCacheUpdateSubScriptionState - OUT");\r
119     pthread_mutex_unlock(&NSCacheMutex);\r
120     return NS_ERROR;\r
121 }\r
122 \r
123 NSResult NSProviderStorageWrite(NSCacheList * list, NSCacheElement * newObj)\r
124 {\r
125     pthread_mutex_lock(&NSCacheMutex);\r
126 \r
127     NSCacheType type = list->cacheType;\r
128 \r
129     NS_LOG(DEBUG, "NSCacheWrite - IN");\r
130 \r
131     if (newObj == NULL)\r
132     {\r
133         NS_LOG(DEBUG, "newObj is NULL - IN");\r
134         pthread_mutex_unlock(&NSCacheMutex);\r
135         return NS_ERROR;\r
136     }\r
137 \r
138     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
139     {\r
140         NS_LOG(DEBUG, "Type is SUBSCRIBER");\r
141 \r
142         NSCacheSubData * subData = (NSCacheSubData *) newObj->data;\r
143         NSCacheElement * it = NSProviderStorageRead(list, subData->id);\r
144 \r
145         if (it)\r
146         {\r
147             NSCacheSubData * itData = (NSCacheSubData *) it->data;\r
148 \r
149             if (strcmp(itData->id, subData->id) == 0)\r
150             {\r
151                 NS_LOG(DEBUG, "Update Data - IN");\r
152 \r
153                 NS_LOG_V(DEBUG, "currData_ID = %s", itData->id);\r
154                 NS_LOG_V(DEBUG, "currData_MsgObID = %d", itData->messageObId);\r
155                 NS_LOG_V(DEBUG, "currData_SyncObID = %d", itData->syncObId);\r
156                 NS_LOG_V(DEBUG, "currData_Cloud_MsgObID = %d", itData->remote_messageObId);\r
157                 NS_LOG_V(DEBUG, "currData_Cloud_SyncObID = %d", itData->remote_syncObId);\r
158                 NS_LOG_V(DEBUG, "currData_IsWhite = %d", itData->isWhite);\r
159 \r
160                 NS_LOG_V(DEBUG, "subData_ID = %s", subData->id);\r
161                 NS_LOG_V(DEBUG, "subData_MsgObID = %d", subData->messageObId);\r
162                 NS_LOG_V(DEBUG, "subData_SyncObID = %d", subData->syncObId);\r
163                 NS_LOG_V(DEBUG, "subData_Cloud_MsgObID = %d", subData->remote_messageObId);\r
164                 NS_LOG_V(DEBUG, "subData_Cloud_SyncObID = %d", subData->remote_syncObId);\r
165                 NS_LOG_V(DEBUG, "subData_IsWhite = %d", subData->isWhite);\r
166 \r
167                 if (subData->messageObId != 0)\r
168                 {\r
169                     itData->messageObId = subData->messageObId;\r
170                 }\r
171 \r
172                 if (subData->syncObId != 0)\r
173                 {\r
174                     itData->syncObId = subData->syncObId;\r
175                 }\r
176 \r
177                 if (subData->remote_messageObId != 0)\r
178                 {\r
179                     itData->remote_messageObId = subData->remote_messageObId;\r
180                 }\r
181 \r
182                 if (subData->remote_syncObId != 0)\r
183                 {\r
184                     itData->remote_syncObId = subData->remote_syncObId;\r
185                     NS_LOG_V(DEBUG, "sync id cached: %d", itData->remote_syncObId);\r
186                 }\r
187 \r
188                 NS_LOG(DEBUG, "Update Data - OUT");\r
189                 OICFree(subData);\r
190                 OICFree(newObj);\r
191                 pthread_mutex_unlock(&NSCacheMutex);\r
192                 return NS_OK;\r
193             }\r
194         }\r
195 \r
196     }\r
197     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
198     {\r
199         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
200 \r
201         NSCacheTopicData * topicData = (NSCacheTopicData *) newObj->data;\r
202         NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);\r
203 \r
204         if (it)\r
205         {\r
206             NS_LOG(DEBUG, "already registered for topic name");\r
207             OICFree(topicData->topicName);\r
208             OICFree(topicData);\r
209             pthread_mutex_unlock(&NSCacheMutex);\r
210             return NS_FAIL;\r
211         }\r
212     }\r
213     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
214     {\r
215         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
216 \r
217         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
218         NSCacheElement * it = NSProviderStorageRead(list, topicData->topicName);\r
219 \r
220         if (it)\r
221         {\r
222             NS_LOG(DEBUG, "already registered for topic name");\r
223             OICFree(topicData->topicName);\r
224             OICFree(topicData);\r
225             pthread_mutex_unlock(&NSCacheMutex);\r
226             return NS_FAIL;\r
227         }\r
228     }\r
229     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
230     {\r
231         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
232 \r
233         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
234         NSCacheElement * it = NSProviderStorageRead(list, topicData->id);\r
235 \r
236         if (it)\r
237         {\r
238             NS_LOG(DEBUG, "already registered for topic name");\r
239             OICFree(topicData->topicName);\r
240             OICFree(topicData);\r
241             pthread_mutex_unlock(&NSCacheMutex);\r
242             return NS_FAIL;\r
243         }\r
244     }\r
245 \r
246     if (list->head == NULL)\r
247     {\r
248         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
249         list->head = list->tail = newObj;\r
250         pthread_mutex_unlock(&NSCacheMutex);\r
251         return NS_OK;\r
252     }\r
253 \r
254     list->tail = list->tail->next = newObj;\r
255     NS_LOG(DEBUG, "list->head is not NULL");\r
256     pthread_mutex_unlock(&NSCacheMutex);\r
257     return NS_OK;\r
258 }\r
259 \r
260 NSResult NSProviderStorageDestroy(NSCacheList * list)\r
261 {\r
262     NSCacheElement * iter = list->head;\r
263     NSCacheElement * next = NULL;\r
264     NSCacheType type = list->cacheType;\r
265 \r
266     while (iter)\r
267     {\r
268         next = (NSCacheElement *) iter->next;\r
269         NSProviderDeleteCacheData(type, iter->data);\r
270         OICFree(iter);\r
271         iter = next;\r
272     }\r
273 \r
274     OICFree(list);\r
275     return NS_OK;\r
276 }\r
277 \r
278 \r
279 bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
280 {\r
281     if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
282                 id == data->remote_syncObId)\r
283     {\r
284         return true;\r
285     }\r
286 \r
287     return false;\r
288 }\r
289 \r
290 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
291 {\r
292     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
293 \r
294     if (data == NULL)\r
295     {\r
296         return false;\r
297     }\r
298 \r
299     NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
300 \r
301     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
302     {\r
303         NSCacheSubData * subData = (NSCacheSubData *) data;\r
304 \r
305         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
306 \r
307         if (strcmp(subData->id, id) == 0)\r
308         {\r
309             NS_LOG(DEBUG, "SubData is Same");\r
310             return true;\r
311         }\r
312 \r
313         NS_LOG(DEBUG, "Message Data is Not Same");\r
314         return false;\r
315     }\r
316     else if (type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
317     {\r
318         NSCacheSubData * subData = (NSCacheSubData *) data;\r
319 \r
320         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
321 \r
322         OCObservationId currID = *id;\r
323 \r
324         if (NSIsSameObId(subData, currID))\r
325         {\r
326             NS_LOG(DEBUG, "SubData is Same");\r
327             return true;\r
328         }\r
329 \r
330         NS_LOG(DEBUG, "Message Data is Not Same");\r
331         return false;\r
332     }\r
333     else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
334     {\r
335         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
336 \r
337         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
338 \r
339         if (strcmp(topicData->topicName, id) == 0)\r
340         {\r
341             NS_LOG(DEBUG, "SubData is Same");\r
342             return true;\r
343         }\r
344 \r
345         NS_LOG(DEBUG, "Message Data is Not Same");\r
346         return false;\r
347     }\r
348     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
349     {\r
350         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
351 \r
352         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
353 \r
354         if (strcmp(topicData->topicName, id) == 0)\r
355         {\r
356             NS_LOG(DEBUG, "SubData is Same");\r
357             return true;\r
358         }\r
359 \r
360         NS_LOG(DEBUG, "Message Data is Not Same");\r
361         return false;\r
362     }\r
363     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
364     {\r
365         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
366 \r
367         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
368 \r
369         if (strcmp(topicData->id, id) == 0)\r
370         {\r
371             NS_LOG(DEBUG, "SubData is Same");\r
372             return true;\r
373         }\r
374 \r
375         NS_LOG(DEBUG, "Message Data is Not Same");\r
376         return false;\r
377     }\r
378 \r
379 \r
380     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
381     return false;\r
382 }\r
383 \r
384 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
385 {\r
386     if (!data)\r
387     {\r
388         return NS_ERROR;\r
389     }\r
390 \r
391     if (type == NS_PROVIDER_CACHE_SUBSCRIBER || type == NS_PROVIDER_CACHE_SUBSCRIBER_OBSERVE_ID)\r
392     {\r
393         NSCacheSubData * subData = (NSCacheSubData *) data;\r
394 \r
395         (subData->id)[0] = '\0';\r
396         OICFree(subData);\r
397         return NS_OK;\r
398     }\r
399     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
400     {\r
401 \r
402         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
403         NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
404                 (int)topicData->state);\r
405 \r
406         OICFree(topicData->topicName);\r
407     }\r
408     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
409             type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
410     {\r
411         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
412         OICFree(topicData->topicName);\r
413     }\r
414 \r
415     return NS_OK;\r
416 }\r
417 \r
418 NSResult NSProviderStorageDelete(NSCacheList * list, const char * delId)\r
419 {\r
420     pthread_mutex_lock(&NSCacheMutex);\r
421     NSCacheElement * prev = list->head;\r
422     NSCacheElement * del = list->head;\r
423 \r
424     NSCacheType type = list->cacheType;\r
425 \r
426     if(!del)\r
427     {\r
428         NS_LOG(DEBUG, "list head is NULL");\r
429         pthread_mutex_unlock(&NSCacheMutex);\r
430         return NS_FAIL;\r
431     }\r
432 \r
433     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
434     {\r
435         if (del == list->head) // first object\r
436         {\r
437             if (del == list->tail) // first object (one object)\r
438             {\r
439                 list->tail = del->next;\r
440             }\r
441 \r
442             list->head = del->next;\r
443             NSProviderDeleteCacheData(type, del->data);\r
444             OICFree(del);\r
445             pthread_mutex_unlock(&NSCacheMutex);\r
446             return NS_OK;\r
447         }\r
448     }\r
449 \r
450     del = del->next;\r
451     while (del)\r
452     {\r
453         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
454         {\r
455             if (del == list->tail) // delete object same to last object\r
456             {\r
457                 list->tail = prev;\r
458             }\r
459 \r
460             prev->next = del->next;\r
461             NSProviderDeleteCacheData(type, del->data);\r
462             OICFree(del);\r
463             pthread_mutex_unlock(&NSCacheMutex);\r
464             return NS_OK;\r
465         }\r
466 \r
467         prev = del;\r
468         del = del->next;\r
469     }\r
470     pthread_mutex_unlock(&NSCacheMutex);\r
471     return NS_FAIL;\r
472 }\r
473 \r
474 NSTopicLL * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
475 {\r
476     NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
477     pthread_mutex_lock(&NSCacheMutex);\r
478 \r
479     NSCacheElement * iter = regTopicList->head;\r
480 \r
481     if(!iter)\r
482     {\r
483         pthread_mutex_unlock(&NSCacheMutex);\r
484         return NULL;\r
485     }\r
486 \r
487     NSTopicLL * iterTopic = NULL;\r
488     NSTopicLL * newTopic = NULL;\r
489     NSTopicLL * topics = NULL;\r
490 \r
491     while (iter)\r
492     {\r
493         NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
494         newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
495         if(!newTopic)\r
496         {\r
497             pthread_mutex_unlock(&NSCacheMutex);\r
498             return NULL;\r
499         }\r
500 \r
501         newTopic->state = curr->state;\r
502         newTopic->next = NULL;\r
503         newTopic->topicName = OICStrdup(curr->topicName);\r
504 \r
505         if(!topics)\r
506         {\r
507             iterTopic = topics = newTopic;\r
508         }\r
509         else\r
510         {\r
511             iterTopic->next = newTopic;\r
512             iterTopic = newTopic;\r
513         }\r
514 \r
515         iter = iter->next;\r
516     }\r
517 \r
518     pthread_mutex_unlock(&NSCacheMutex);\r
519     NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
520 \r
521     return topics;\r
522 }\r
523 \r
524 NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * regTopicList,\r
525         NSCacheList * conTopicList, const char * consumerId)\r
526 {\r
527     NS_LOG(DEBUG, "NSProviderGetConsumerTopicsCacheData - IN");\r
528 \r
529     pthread_mutex_lock(&NSCacheMutex);\r
530     NSTopicLL * topics = NSProviderGetTopicsCacheData(regTopicList);\r
531 \r
532     if(!topics)\r
533     {\r
534         pthread_mutex_unlock(&NSCacheMutex);\r
535         return NULL;\r
536     }\r
537 \r
538     NSCacheElement * iter = conTopicList->head;\r
539     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
540 \r
541     while(iter)\r
542     {\r
543         NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
544 \r
545         if(curr && strcmp(curr->id, consumerId) == 0)\r
546         {\r
547             NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
548             NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
549 \r
550             NSTopicLL * topicIter = topics;\r
551             while(topicIter)\r
552             {\r
553                 if(strcmp(topicIter->topicName, curr->topicName) == 0)\r
554                 {\r
555                     topicIter->state = NS_TOPIC_SUBSCRIBED;\r
556                     break;\r
557                 }\r
558                 topicIter = topicIter->next;\r
559             }\r
560         }\r
561 \r
562         iter = iter->next;\r
563     }\r
564 \r
565     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
566     pthread_mutex_unlock(&NSCacheMutex);\r
567     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
568 \r
569     return topics;\r
570 }\r
571 \r
572 bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
573 {\r
574     pthread_mutex_lock(&NSCacheMutex);\r
575 \r
576     if(!conTopicList || !cId || !topicName)\r
577     {\r
578         pthread_mutex_unlock(&NSCacheMutex);\r
579         return false;\r
580     }\r
581 \r
582     NSCacheElement * iter = conTopicList;\r
583     while(iter)\r
584     {\r
585         NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
586 \r
587         if( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
588         {\r
589             pthread_mutex_unlock(&NSCacheMutex);\r
590             return true;\r
591         }\r
592         iter = iter->next;\r
593     }\r
594 \r
595     pthread_mutex_unlock(&NSCacheMutex);\r
596     return false;\r
597 }\r
598 \r
599 NSResult NSProviderDeleteConsumerTopic(NSCacheList * conTopicList,\r
600         NSCacheTopicSubData * topicSubData)\r
601 {\r
602     pthread_mutex_lock(&NSCacheMutex);\r
603 \r
604     char * cId = topicSubData->id;\r
605     char * topicName = topicSubData->topicName;\r
606 \r
607     if(!conTopicList || !cId || !topicName)\r
608     {\r
609         pthread_mutex_unlock(&NSCacheMutex);\r
610         return NS_ERROR;\r
611     }\r
612 \r
613     NSCacheElement * prev = conTopicList->head;\r
614     NSCacheElement * del = conTopicList->head;\r
615 \r
616     NSCacheType type = conTopicList->cacheType;\r
617 \r
618     if(!del)\r
619     {\r
620         NS_LOG(DEBUG, "list head is NULL");\r
621         pthread_mutex_unlock(&NSCacheMutex);\r
622         return NS_FAIL;\r
623     }\r
624 \r
625     NSCacheTopicSubData * curr = (NSCacheTopicSubData *) del->data;\r
626     NS_LOG_V(DEBUG, "compareid = %s", cId);\r
627     NS_LOG_V(DEBUG, "comparetopicName = %s", topicName);\r
628     NS_LOG_V(DEBUG, "curr->id = %s", curr->id);\r
629     NS_LOG_V(DEBUG, "curr->topicName = %s", curr->topicName);\r
630 \r
631     if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
632             (strcmp(curr->topicName, topicName) == 0) )\r
633     {\r
634         if (del == conTopicList->head) // first object\r
635         {\r
636             if (del == conTopicList->tail) // first object (one object)\r
637             {\r
638                 conTopicList->tail = del->next;\r
639             }\r
640 \r
641             conTopicList->head = del->next;\r
642             NSProviderDeleteCacheData(type, del->data);\r
643             OICFree(del);\r
644             pthread_mutex_unlock(&NSCacheMutex);\r
645             return NS_OK;\r
646         }\r
647     }\r
648 \r
649     curr = NULL;\r
650     del = del->next;\r
651     while (del)\r
652     {\r
653         curr = (NSCacheTopicSubData *) del->data;\r
654         if( (strncmp(curr->id, cId, NS_UUID_STRING_SIZE) == 0) &&\r
655                 (strcmp(curr->topicName, topicName) == 0) )\r
656         {\r
657             if (del == conTopicList->tail) // delete object same to last object\r
658             {\r
659                 conTopicList->tail = prev;\r
660             }\r
661 \r
662             prev->next = del->next;\r
663             NSProviderDeleteCacheData(type, del->data);\r
664             OICFree(del);\r
665             pthread_mutex_unlock(&NSCacheMutex);\r
666             return NS_OK;\r
667         }\r
668 \r
669         prev = del;\r
670         del = del->next;\r
671     }\r
672     pthread_mutex_unlock(&NSCacheMutex);\r
673     return NS_FAIL;\r
674 }\r