Merge remote-tracking branch 'origin/master' into notification-service
[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 * NSStorageCreate()\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 * NSStorageRead(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 = NSStorageRead(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 NSStorageWrite(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 = NSStorageRead(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 \r
190                 pthread_mutex_unlock(&NSCacheMutex);\r
191                 return NS_OK;\r
192             }\r
193         }\r
194 \r
195     }\r
196     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
197     {\r
198         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
199 \r
200         NSCacheTopicData * topicData = (NSCacheTopicData *) newObj->data;\r
201         NSCacheElement * it = NSStorageRead(list, topicData->topicName);\r
202 \r
203         if (it)\r
204         {\r
205             NS_LOG(DEBUG, "already registered for topic name");\r
206             pthread_mutex_unlock(&NSCacheMutex);\r
207             return NS_FAIL;\r
208         }\r
209     }\r
210     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
211     {\r
212         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
213 \r
214         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
215         NSCacheElement * it = NSStorageRead(list, topicData->topicName);\r
216 \r
217         if (it)\r
218         {\r
219             NS_LOG(DEBUG, "already registered for topic name");\r
220             pthread_mutex_unlock(&NSCacheMutex);\r
221             return NS_FAIL;\r
222         }\r
223     }\r
224 \r
225     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
226     {\r
227         NS_LOG(DEBUG, "Type is REGITSTER TOPIC");\r
228 \r
229         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) newObj->data;\r
230         NSCacheElement * it = NSStorageRead(list, topicData->id);\r
231 \r
232         if (it)\r
233         {\r
234             NS_LOG(DEBUG, "already registered for topic name");\r
235             pthread_mutex_unlock(&NSCacheMutex);\r
236             return NS_FAIL;\r
237         }\r
238     }\r
239 \r
240 \r
241     if (list->head == NULL)\r
242     {\r
243         NS_LOG(DEBUG, "list->head is NULL, Insert First Data");\r
244         list->head = list->tail = newObj;\r
245         pthread_mutex_unlock(&NSCacheMutex);\r
246         return NS_OK;\r
247     }\r
248 \r
249     list->tail = list->tail->next = newObj;\r
250     NS_LOG(DEBUG, "list->head is not NULL");\r
251     pthread_mutex_unlock(&NSCacheMutex);\r
252     return NS_OK;\r
253 }\r
254 \r
255 NSResult NSStorageDestroy(NSCacheList * list)\r
256 {\r
257     NSCacheElement * iter = list->head;\r
258     NSCacheElement * next = NULL;\r
259     NSCacheType type = list->cacheType;\r
260 \r
261     while (iter)\r
262     {\r
263         next = (NSCacheElement *) iter->next;\r
264         NSProviderDeleteCacheData(type, iter->data);\r
265         OICFree(iter);\r
266         iter = next;\r
267     }\r
268 \r
269     OICFree(list);\r
270     return NS_OK;\r
271 }\r
272 \r
273 bool NSProviderCompareIdCacheData(NSCacheType type, void * data, const char * id)\r
274 {\r
275     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - IN");\r
276 \r
277     if (data == NULL)\r
278     {\r
279         return false;\r
280     }\r
281 \r
282     NS_LOG_V(DEBUG, "Data(compData) = [%s]", id);\r
283 \r
284     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
285     {\r
286         NSCacheSubData * subData = (NSCacheSubData *) data;\r
287 \r
288         NS_LOG_V(DEBUG, "Data(subData) = [%s]", subData->id);\r
289 \r
290         if (strcmp(subData->id, id) == 0)\r
291         {\r
292             NS_LOG(DEBUG, "SubData is Same");\r
293             return true;\r
294         }\r
295 \r
296         NS_LOG(DEBUG, "Message Data is Not Same");\r
297         return false;\r
298     }\r
299     else if (type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
300     {\r
301         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
302 \r
303         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
304 \r
305         if (strcmp(topicData->topicName, id) == 0)\r
306         {\r
307             NS_LOG(DEBUG, "SubData is Same");\r
308             return true;\r
309         }\r
310 \r
311         NS_LOG(DEBUG, "Message Data is Not Same");\r
312         return false;\r
313     }\r
314     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME)\r
315     {\r
316         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
317 \r
318         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->topicName);\r
319 \r
320         if (strcmp(topicData->topicName, id) == 0)\r
321         {\r
322             NS_LOG(DEBUG, "SubData is Same");\r
323             return true;\r
324         }\r
325 \r
326         NS_LOG(DEBUG, "Message Data is Not Same");\r
327         return false;\r
328     }\r
329     else if (type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
330     {\r
331         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
332 \r
333         NS_LOG_V(DEBUG, "Data(topicData) = [%s]", topicData->id);\r
334 \r
335         if (strcmp(topicData->id, id) == 0)\r
336         {\r
337             NS_LOG(DEBUG, "SubData is Same");\r
338             return true;\r
339         }\r
340 \r
341         NS_LOG(DEBUG, "Message Data is Not Same");\r
342         return false;\r
343     }\r
344 \r
345 \r
346     NS_LOG(DEBUG, "NSProviderCompareIdCacheData - OUT");\r
347     return false;\r
348 }\r
349 \r
350 NSResult NSProviderDeleteCacheData(NSCacheType type, void * data)\r
351 {\r
352     if (data == NULL)\r
353     {\r
354         return NS_OK;\r
355     }\r
356 \r
357     if (type == NS_PROVIDER_CACHE_SUBSCRIBER)\r
358     {\r
359         NSCacheSubData * subData = (NSCacheSubData *) data;\r
360 \r
361         (subData->id)[0] = '\0';\r
362         OICFree(subData);\r
363 \r
364         return NS_OK;\r
365     }\r
366     else if(type == NS_PROVIDER_CACHE_REGISTER_TOPIC)\r
367     {\r
368 \r
369         NSCacheTopicData * topicData = (NSCacheTopicData *) data;\r
370         NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", topicData->topicName,\r
371                 (int)topicData->state);\r
372 \r
373         OICFree(topicData->topicName);\r
374 \r
375         NS_LOG_V(DEBUG, "topicData->topicName = %s, topicData->state = %d", "aaa",\r
376                 (int)3);\r
377     }\r
378     else if(type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME ||\r
379             type == NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID)\r
380     {\r
381         NSCacheTopicSubData * topicData = (NSCacheTopicSubData *) data;\r
382         OICFree(topicData->topicName);\r
383     }\r
384 \r
385     return NS_OK;\r
386 }\r
387 \r
388 bool NSIsSameObId(NSCacheSubData * data, OCObservationId id)\r
389 {\r
390     if (id == data->messageObId || id == data->syncObId || id == data->remote_messageObId ||\r
391                 id == data->remote_syncObId)\r
392     {\r
393         return true;\r
394     }\r
395 \r
396     return false;\r
397 }\r
398 \r
399 NSResult NSProviderDeleteSubDataFromObId(NSCacheList * list, OCObservationId id)\r
400 {\r
401     if(!list || !list->head)\r
402     {\r
403         NS_LOG(INFO, "list is NULL");\r
404         return NS_FAIL;\r
405     }\r
406 \r
407     pthread_mutex_lock(&NSCacheMutex);\r
408     NSCacheElement * prev = list->head;\r
409     NSCacheElement * del = list->head;\r
410 \r
411     NSCacheType type = list->cacheType;\r
412 \r
413     bool isDelete = true;\r
414 \r
415     while(isDelete)\r
416     {\r
417         NSCacheSubData * curr = (NSCacheSubData *)del->data;\r
418 \r
419         isDelete = false;\r
420 \r
421         if (NSIsSameObId(curr, id))\r
422         {\r
423             if (del == list->head) // first object\r
424             {\r
425                 if (del == list->tail) // first object (one object)\r
426                 {\r
427                     list->tail = del->next;\r
428                 }\r
429 \r
430                 list->head = del->next;\r
431 \r
432                 NSProviderDeleteCacheData(type, del->data);\r
433                 OICFree(del);\r
434                 isDelete = true;\r
435             }\r
436         }\r
437         else\r
438         {\r
439             del = del->next;\r
440             while (del)\r
441             {\r
442                 if (NSIsSameObId(curr, id))\r
443                 {\r
444                     if (del == list->tail) // delete object same to last object\r
445                     {\r
446                         list->tail = prev;\r
447                     }\r
448 \r
449                     prev->next = del->next;\r
450                     NSProviderDeleteCacheData(type, del->data);\r
451                     OICFree(del);\r
452                     isDelete = true;\r
453                     break;\r
454                 }\r
455 \r
456                 prev = del;\r
457                 del = del->next;\r
458             }\r
459         }\r
460     }\r
461     pthread_mutex_unlock(&NSCacheMutex);\r
462     return NS_OK;\r
463 }\r
464 \r
465 NSResult NSStorageDelete(NSCacheList * list, const char * delId)\r
466 {\r
467     pthread_mutex_lock(&NSCacheMutex);\r
468     NSCacheElement * prev = list->head;\r
469     NSCacheElement * del = list->head;\r
470 \r
471     NSCacheType type = list->cacheType;\r
472 \r
473     if(!del)\r
474     {\r
475         NS_LOG(DEBUG, "list head is NULL");\r
476         return NS_FAIL;\r
477     }\r
478 \r
479     if (NSProviderCompareIdCacheData(type, del->data, delId))\r
480     {\r
481         if (del == list->head) // first object\r
482         {\r
483             if (del == list->tail) // first object (one object)\r
484             {\r
485                 list->tail = del->next;\r
486             }\r
487 \r
488             list->head = del->next;\r
489             NSProviderDeleteCacheData(type, del->data);\r
490             OICFree(del);\r
491             pthread_mutex_unlock(&NSCacheMutex);\r
492             return NS_OK;\r
493         }\r
494     }\r
495 \r
496     del = del->next;\r
497     while (del)\r
498     {\r
499         if (NSProviderCompareIdCacheData(type, del->data, delId))\r
500         {\r
501             if (del == list->tail) // delete object same to last object\r
502             {\r
503                 list->tail = prev;\r
504             }\r
505 \r
506             prev->next = del->next;\r
507             NSProviderDeleteCacheData(type, del->data);\r
508             OICFree(del);\r
509             pthread_mutex_unlock(&NSCacheMutex);\r
510             return NS_OK;\r
511         }\r
512 \r
513         prev = del;\r
514         del = del->next;\r
515     }\r
516     pthread_mutex_unlock(&NSCacheMutex);\r
517     return NS_FAIL;\r
518 }\r
519 \r
520 NSTopicLL * NSProviderGetTopicsCacheData(NSCacheList * regTopicList)\r
521 {\r
522     NS_LOG(DEBUG, "NSProviderGetTopicsCache - IN");\r
523     pthread_mutex_lock(&NSCacheMutex);\r
524 \r
525     NSCacheElement * iter = regTopicList->head;\r
526 \r
527     if(!iter)\r
528     {\r
529         pthread_mutex_unlock(&NSCacheMutex);\r
530         return NULL;\r
531     }\r
532 \r
533     NSTopicLL * iterTopic = NULL;\r
534     NSTopicLL * newTopic = NULL;\r
535     NSTopicLL * topics = NULL;\r
536 \r
537     while (iter)\r
538     {\r
539         NSCacheTopicData * curr = (NSCacheTopicData *) iter->data;\r
540 \r
541         newTopic = (NSTopicLL *) OICMalloc(sizeof(NSTopicLL));\r
542         newTopic->state = curr->state;\r
543         newTopic->next = NULL;\r
544         newTopic->topicName = OICStrdup(curr->topicName);\r
545 \r
546         if(!topics)\r
547         {\r
548             iterTopic = topics = newTopic;\r
549         }\r
550         else\r
551         {\r
552             iterTopic->next = newTopic;\r
553             iterTopic = newTopic;\r
554         }\r
555 \r
556         iter = iter->next;\r
557     }\r
558 \r
559     pthread_mutex_unlock(&NSCacheMutex);\r
560     NS_LOG(DEBUG, "NSProviderGetTopicsCache - OUT");\r
561 \r
562     return topics;\r
563 }\r
564 \r
565 NSTopicLL * NSProviderGetConsumerTopicsCacheData(NSCacheList * conTopicList, char *consumerId)\r
566 {\r
567     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - IN");\r
568 \r
569     pthread_mutex_lock(&NSCacheMutex);\r
570     NSTopicLL * topics = NSProviderGetTopics();\r
571 \r
572     if(!topics)\r
573     {\r
574         pthread_mutex_unlock(&NSCacheMutex);\r
575         return NULL;\r
576     }\r
577 \r
578     NSCacheElement * iter = conTopicList->head;\r
579     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
580 \r
581     while(iter)\r
582     {\r
583         NSCacheTopicSubData * curr = (NSCacheTopicSubData *)iter->data;\r
584 \r
585         if(curr && strcmp(curr->id, consumerId) == 0)\r
586         {\r
587             NSTopicLL * topicIter = topics;\r
588             while(topicIter)\r
589             {\r
590                 if(strcmp(topicIter->topicName, curr->topicName) == 0)\r
591                 {\r
592                     topicIter->state = NS_TOPIC_SUBSCRIBED;\r
593                     break;\r
594                 }\r
595                 topicIter = topicIter->next;\r
596             }\r
597         }\r
598 \r
599         iter = iter->next;\r
600     }\r
601 \r
602     conTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
603     pthread_mutex_unlock(&NSCacheMutex);\r
604     NS_LOG(DEBUG, "NSProviderGetConsumerTopics - OUT");\r
605 \r
606     return topics;\r
607 }\r
608 \r
609 size_t NSProviderGetListSize(NSCacheElement * firstElement)\r
610 {\r
611     pthread_mutex_lock(&NSCacheMutex);\r
612     if(!firstElement)\r
613     {\r
614         pthread_mutex_unlock(&NSCacheMutex);\r
615         return 0;\r
616     }\r
617 \r
618     int cnt = 0;\r
619 \r
620     NSCacheElement * iter = firstElement;\r
621 \r
622     while(iter)\r
623     {\r
624         cnt++;\r
625         iter = iter->next;\r
626     }\r
627 \r
628     pthread_mutex_unlock(&NSCacheMutex);\r
629     return cnt;\r
630 }\r
631 \r
632 bool NSProviderIsTopicSubScribed(NSCacheElement * conTopicList, char * cId, char * topicName)\r
633 {\r
634     pthread_mutex_lock(&NSCacheMutex);\r
635 \r
636     if(!conTopicList || !cId || !topicName)\r
637     {\r
638         return false;\r
639         pthread_mutex_unlock(&NSCacheMutex);\r
640     }\r
641 \r
642     NSCacheElement * iter = conTopicList;\r
643     while(iter)\r
644     {\r
645         NSCacheTopicSubData * curr = (NSCacheTopicSubData *) iter->data;\r
646 \r
647         if( (strcmp(curr->id, cId) == 0) && (strcmp(curr->topicName, topicName) == 0) )\r
648         {\r
649             pthread_mutex_unlock(&NSCacheMutex);\r
650             return true;\r
651         }\r
652         iter = iter->next;\r
653     }\r
654 \r
655     pthread_mutex_unlock(&NSCacheMutex);\r
656     return false;\r
657 }\r