change asynccall Function to synccall function.
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderTopic.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 "NSProviderTopic.h"\r
22 #include "oic_string.h"\r
23 #include "oic_malloc.h"\r
24 #include <pthread.h>\r
25 \r
26 NSResult NSSendTopicUpdation();\r
27 \r
28 NSResult NSInitTopicList()\r
29 {\r
30     NS_LOG(DEBUG, "NSInitTopicList - IN");\r
31 \r
32     consumerTopicList = NSProviderStorageCreate();\r
33     NS_VERIFY_NOT_NULL(consumerTopicList, NS_FAIL);\r
34     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
35 \r
36     registeredTopicList = NSProviderStorageCreate();\r
37     NS_VERIFY_NOT_NULL(registeredTopicList, NS_FAIL);\r
38     registeredTopicList->cacheType = NS_PROVIDER_CACHE_REGISTER_TOPIC;\r
39 \r
40     NS_LOG(DEBUG, "NSInitTopicList - OUT");\r
41     return NS_OK;\r
42 }\r
43 \r
44 size_t NSProviderGetTopicListSize(NSTopicLL * firstElement)\r
45 {\r
46     if (!firstElement)\r
47     {\r
48         return 0;\r
49     }\r
50 \r
51     int cnt = 0;\r
52 \r
53     NSTopicLL * iter = firstElement;\r
54 \r
55     while (iter)\r
56     {\r
57         cnt++;\r
58         iter = iter->next;\r
59     }\r
60 \r
61     return cnt;\r
62 }\r
63 \r
64 NSResult NSRegisterTopic(const char * topicName)\r
65 {\r
66     NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
67 \r
68     NSCacheTopicData * data = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData));\r
69     NS_VERIFY_NOT_NULL(data, NS_FAIL);\r
70     data->topicName = (char *) topicName;\r
71     data->state = NS_TOPIC_UNSUBSCRIBED;\r
72 \r
73     NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
74     if (!element)\r
75     {\r
76         OICFree(data->topicName);\r
77         OICFree(data);\r
78         return NS_FAIL;\r
79     }\r
80     element->data = (void *) data;\r
81     element->next = NULL;\r
82 \r
83     if(NSProviderStorageWrite(registeredTopicList, element) != NS_OK)\r
84     {\r
85         NS_LOG(DEBUG, "fail to write cache");\r
86         return NS_FAIL;\r
87     }\r
88     NSSendTopicUpdation();\r
89 \r
90     NS_LOG(DEBUG, "NSWriteTopicsToStorage() NS_OK");\r
91     return NS_OK;\r
92 }\r
93 \r
94 NSResult NSUnregisterTopic(const char * topicName)\r
95 {\r
96     NS_LOG(DEBUG, "NSDeleteTopics()");\r
97     NSResult result = NS_OK;\r
98 \r
99     if (!topicName)\r
100     {\r
101         NS_LOG(ERROR, "topicName is NULL");\r
102         return NS_ERROR;\r
103     }\r
104 \r
105     result = NSProviderStorageDelete(registeredTopicList, topicName);\r
106     while (NSProviderStorageDelete(consumerTopicList, topicName) != NS_FAIL)\r
107     {\r
108     }\r
109 \r
110     if (result == NS_OK)\r
111     {\r
112         NSSendTopicUpdation();\r
113     }\r
114 \r
115     return result;\r
116 }\r
117 \r
118 NSResult NSSendTopicUpdation()\r
119 {\r
120     NS_LOG(DEBUG, "NSSendTopicUpdation - IN");\r
121 \r
122     OCRepPayload* payload = OCRepPayloadCreate();\r
123 \r
124     if (!payload)\r
125     {\r
126         NS_LOG(ERROR, "fail to create playload");\r
127         return NS_ERROR;\r
128     }\r
129 \r
130     OCResourceHandle rHandle = NULL;\r
131     if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
132     {\r
133         NS_LOG(ERROR, "Fail to put message resource");\r
134         return NS_ERROR;\r
135     }\r
136 \r
137     OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
138     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
139     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
140 \r
141     OCObservationId obArray[255] =\r
142     { 0, };\r
143     int obCount = 0;\r
144 \r
145     NSCacheElement * it = consumerSubList->head;\r
146 \r
147     while (it)\r
148     {\r
149         NSCacheSubData * subData = (NSCacheSubData *) it->data;\r
150 \r
151         if (subData->isWhite)\r
152         {\r
153             if (subData->messageObId != 0)\r
154             {\r
155                 obArray[obCount++] = subData->messageObId;\r
156             }\r
157 \r
158 #if(defined WITH_CLOUD && defined RD_CLIENT)\r
159             if(subData->remote_messageObId != 0)\r
160             {\r
161                 obArray[obCount++] = subData->remote_messageObId;\r
162             }\r
163 #endif\r
164         }\r
165         it = it->next;\r
166     }\r
167 \r
168     if (!obCount)\r
169     {\r
170         NS_LOG(ERROR, "observer count is zero");\r
171         return NS_ERROR;\r
172     }\r
173 \r
174     if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS) != OC_STACK_OK)\r
175     {\r
176         NS_LOG(ERROR, "fail to send topic updation");\r
177         OCRepPayloadDestroy(payload);\r
178         return NS_ERROR;\r
179 \r
180     }\r
181     OCRepPayloadDestroy(payload);\r
182 \r
183     NS_LOG(DEBUG, "NSSendTopicUpdation - OUT");\r
184     return NS_OK;\r
185 }\r
186 \r
187 NSResult NSSendTopicUpdationToConsumer(char *consumerId)\r
188 {\r
189     NS_LOG(DEBUG, "NSSendTopicUpdationToConsumer - IN");\r
190 \r
191     OCRepPayload* payload = OCRepPayloadCreate();\r
192 \r
193     if (!payload)\r
194     {\r
195         NS_LOG(ERROR, "fail to create playload");\r
196         return NS_ERROR;\r
197     }\r
198 \r
199     OCResourceHandle rHandle = NULL;\r
200     if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
201     {\r
202         NS_LOG(ERROR, "Fail to put message resource");\r
203         return NS_ERROR;\r
204     }\r
205 \r
206     OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
207     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
208     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
209 \r
210     NSCacheElement * element = NSProviderStorageRead(consumerSubList, consumerId);\r
211 \r
212     if (element == NULL)\r
213     {\r
214         NS_LOG(ERROR, "element is NULL");\r
215         return NS_ERROR;\r
216     }\r
217 \r
218     NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
219 \r
220     if (OCNotifyListOfObservers(rHandle, (OCObservationId*) &subData->messageObId, 1, payload,\r
221             OC_HIGH_QOS) != OC_STACK_OK)\r
222     {\r
223         NS_LOG(ERROR, "fail to send topic updation");\r
224         OCRepPayloadDestroy(payload);\r
225         return NS_ERROR;\r
226     }\r
227 \r
228     OCRepPayloadDestroy(payload);\r
229 \r
230     NS_LOG(DEBUG, "NSSendTopicUpdationToConsumer - OUT");\r
231     return NS_OK;\r
232 }\r
233 \r
234 NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)\r
235 {\r
236     NS_LOG(DEBUG, "NSSendTopicList - IN");\r
237 \r
238     char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
239     NSTopicLL * topics = NULL;\r
240 \r
241     if (!id)\r
242     {\r
243         NS_LOG(DEBUG, "Send registered topic list");\r
244         topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
245     }\r
246     else\r
247     {\r
248         NS_LOG(DEBUG, "Send subscribed topic list to consumer");\r
249         topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, consumerTopicList, id);\r
250         if (!topics)\r
251         {\r
252             topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
253         }\r
254     }\r
255 \r
256     // make response for the Get Request\r
257     OCEntityHandlerResponse response;\r
258     response.numSendVendorSpecificHeaderOptions = 0;\r
259     memset(response.sendVendorSpecificHeaderOptions, 0,\r
260             sizeof response.sendVendorSpecificHeaderOptions);\r
261     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
262 \r
263     OCRepPayload* payload = OCRepPayloadCreate();\r
264     if (!payload)\r
265     {\r
266         NS_LOG(ERROR, "payload is NULL");\r
267         return NS_ERROR;\r
268     }\r
269 \r
270     OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
271     if (id)\r
272     {\r
273         OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
274     }\r
275     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
276 \r
277     if (topics)\r
278     {\r
279         NS_LOG(DEBUG, "topicList is NULL");\r
280         size_t dimensionSize = (size_t) NSProviderGetTopicListSize(topics);\r
281 \r
282         NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize);\r
283 \r
284         if (!dimensionSize)\r
285         {\r
286             return NS_ERROR;\r
287         }\r
288 \r
289         OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
290                 sizeof(OCRepPayload *) * dimensionSize);\r
291         NS_VERIFY_NOT_NULL(payloadTopicArray, NS_ERROR);\r
292 \r
293         size_t dimensions[3] =\r
294         { dimensionSize, 0, 0 };\r
295 \r
296         for (int i = 0; i < (int) dimensionSize; i++)\r
297         {\r
298             NS_LOG_V(DEBUG, "topicName = %s", topics->topicName);\r
299             NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state);\r
300 \r
301             payloadTopicArray[i] = OCRepPayloadCreate();\r
302             NS_VERIFY_NOT_NULL(payloadTopicArray[i], NS_ERROR);\r
303             OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME,\r
304                     topics->topicName);\r
305             OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
306                     (int) topics->state);\r
307 \r
308             topics = topics->next;\r
309         }\r
310 \r
311         OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
312                 (const OCRepPayload**) (payloadTopicArray), dimensions);\r
313     }\r
314     else\r
315     {\r
316         size_t dimensions[3] =\r
317         { 0, 0, 0 };\r
318 \r
319         OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
320                 (OCRepPayload **) NULL, dimensions);\r
321     }\r
322 \r
323     char * reqInterface =\r
324             NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_INTERFACE);\r
325 \r
326     if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
327     {\r
328         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
329         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
330         OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
331     }\r
332 \r
333     response.requestHandle = entityHandlerRequest->requestHandle;\r
334     response.resourceHandle = entityHandlerRequest->resource;\r
335     response.persistentBufferFlag = 0;\r
336     response.ehResult = OC_EH_OK;\r
337     response.payload = (OCPayload *) payload;\r
338 \r
339     if (OCDoResponse(&response) != OC_STACK_OK)\r
340     {\r
341         NS_LOG(ERROR, "Fail to response topic list");\r
342         return NS_ERROR;\r
343     }\r
344     OCRepPayloadDestroy(payload);\r
345 \r
346     NS_LOG(DEBUG, "NSSendTopicList - OUT");\r
347     return NS_OK;\r
348 }\r
349 \r
350 NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)\r
351 {\r
352     NS_LOG(DEBUG, "NSPostConsumerTopics() - IN");\r
353 \r
354     char * consumerId = NULL;\r
355     OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload;\r
356     OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId);\r
357 \r
358     if (!consumerId)\r
359     {\r
360         NS_LOG(DEBUG, "Invalid consumer ID");\r
361         return NS_FAIL;\r
362     }\r
363 \r
364     NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId);\r
365 \r
366     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
367
368     while (NSProviderStorageDelete(consumerTopicList, consumerId) != NS_FAIL)\r
369     {\r
370     }\r
371     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
372 \r
373     OCRepPayload ** topicListPayload = NULL;\r
374     OCRepPayloadValue * payloadValue = NULL;\r
375     payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
376     size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
377     size_t dimensions[3] = { dimensionSize, 0, 0 };\r
378     OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, dimensions);\r
379 \r
380     for (int i = 0; i < (int) dimensionSize; i++)\r
381     {\r
382         char * topicName = NULL;\r
383         int64_t topicState = 0;\r
384 \r
385         OCRepPayloadGetPropString(topicListPayload[i], NS_ATTRIBUTE_TOPIC_NAME, &topicName);\r
386         OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &topicState);\r
387         NS_LOG_V(DEBUG, "Topic Name(state):  %s(%d)", topicName, (int)topicState);\r
388 \r
389         if (NS_TOPIC_SUBSCRIBED == (NSTopicState) topicState)\r
390         {\r
391             NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) OICMalloc(\r
392                     sizeof(NSCacheTopicSubData));\r
393             NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL);\r
394 \r
395             OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
396             topicSubData->topicName = topicName;\r
397 \r
398             NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
399 \r
400             if (!newObj)\r
401             {\r
402                 OICFree(topicSubData->topicName);\r
403                 OICFree(topicSubData);\r
404                 OICFree(consumerId);\r
405                 return NS_FAIL;\r
406             }\r
407 \r
408             newObj->data = (NSCacheData *) topicSubData;\r
409             newObj->next = NULL;\r
410 \r
411             NSProviderStorageWrite(consumerTopicList, newObj);
412         }\r
413     }\r
414     NSSendTopicUpdationToConsumer(consumerId);\r
415     OICFree(consumerId);\r
416     NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
417     return NS_OK;\r
418 }\r
419 \r
420 void * NSTopicSchedule(void * ptr)\r
421 {\r
422     if (ptr == NULL)\r
423     {\r
424         NS_LOG(DEBUG, "Create NSTopicSchedule");\r
425     }\r
426 \r
427     while (NSIsRunning[TOPIC_SCHEDULER])\r
428     {\r
429         sem_wait(&NSSemaphore[TOPIC_SCHEDULER]);\r
430         pthread_mutex_lock(&NSMutex[TOPIC_SCHEDULER]);\r
431 \r
432         if (NSHeadMsg[TOPIC_SCHEDULER] != NULL)\r
433         {\r
434             NSTask *node = NSHeadMsg[TOPIC_SCHEDULER];\r
435             NSHeadMsg[TOPIC_SCHEDULER] = node->nextTask;\r
436 \r
437             switch (node->taskType)\r
438             {\r
439                 case TASK_SEND_TOPICS:\r
440                     NS_LOG(DEBUG, "CASE TASK_SEND_TOPICS : ");\r
441                     NSSendTopicList((OCEntityHandlerRequest*) node->taskData);\r
442                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
443                     break;\r
444                 case TASK_SUBSCRIBE_TOPIC:\r
445                 {\r
446                     NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
447                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
448                     pthread_mutex_lock(topicSyncResult->mutex);\r
449                     NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
450                     NSCacheTopicSubData * subData =\r
451                             (NSCacheTopicSubData *) topicSyncResult->topicData;\r
452                     if (!newObj)\r
453                     {\r
454                         OICFree(subData->topicName);\r
455                         OICFree(subData);\r
456                         pthread_cond_signal(topicSyncResult->condition);\r
457                         pthread_mutex_unlock(topicSyncResult->mutex);\r
458                     }\r
459                     else\r
460                     {\r
461                         if (NSProviderStorageRead(registeredTopicList, subData->topicName))\r
462                         {\r
463                             newObj->data = topicSyncResult->topicData;\r
464                             newObj->next = NULL;\r
465                             NSProviderStorageWrite(consumerTopicList, newObj);\r
466                             NSSendTopicUpdationToConsumer(subData->id);\r
467                             topicSyncResult->result = NS_OK;\r
468                         }\r
469                     }\r
470                     pthread_cond_signal(topicSyncResult->condition);\r
471                     pthread_mutex_unlock(topicSyncResult->mutex);\r
472
473                 }\r
474                     break;\r
475                 case TASK_UNSUBSCRIBE_TOPIC:\r
476                 {\r
477                     NS_LOG(DEBUG, "CASE TASK_UNSUBSCRIBE_TOPIC : ");\r
478                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
479                     pthread_mutex_lock(topicSyncResult->mutex);\r
480                     NSCacheTopicSubData * topicSubData =\r
481                             (NSCacheTopicSubData *) topicSyncResult->topicData;\r
482                     if (NSProviderDeleteConsumerTopic(consumerTopicList, topicSubData) == NS_OK)\r
483                     {\r
484                         NSSendTopicUpdationToConsumer(topicSubData->id);\r
485                         topicSyncResult->result = NS_OK;\r
486                     }\r
487                     OICFree(topicSubData->topicName);\r
488                     OICFree(topicSubData);\r
489                     pthread_cond_signal(topicSyncResult->condition);\r
490                     pthread_mutex_unlock(topicSyncResult->mutex);\r
491 \r
492                 }\r
493                     break;\r
494                 case TASK_REGISTER_TOPIC:\r
495                 {\r
496                     NS_LOG(DEBUG, "CASE TASK_ADD_TOPIC : ");\r
497                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
498 \r
499                     pthread_mutex_lock(topicSyncResult->mutex);\r
500                     topicSyncResult->result = NSRegisterTopic(\r
501                             (const char *) topicSyncResult->topicData);\r
502                     pthread_cond_signal(topicSyncResult->condition);\r
503                     pthread_mutex_unlock(topicSyncResult->mutex);\r
504                 }\r
505                     break;\r
506                 case TASK_UNREGISTER_TOPIC:\r
507                 {\r
508                     NS_LOG(DEBUG, "CASE_TASK_DELETE_TOPIC : ");\r
509                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
510                     pthread_mutex_lock(topicSyncResult->mutex);\r
511                     topicSyncResult->result = NSUnregisterTopic(\r
512                             (const char *) topicSyncResult->topicData);\r
513                     pthread_cond_signal(topicSyncResult->condition);\r
514                     pthread_mutex_unlock(topicSyncResult->mutex);\r
515                 }\r
516                     break;\r
517                 case TASK_POST_TOPIC:\r
518                 {\r
519                     NS_LOG(DEBUG, "TASK_POST_TOPIC : ");\r
520                     NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData);\r
521                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
522                 }\r
523                     break;\r
524                 case TASK_GET_TOPICS:\r
525                 {\r
526                     NS_LOG(DEBUG, "TASK_GET_TOPICS : ");\r
527                     NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
528                     pthread_mutex_lock(topicSync->mutex);\r
529                     NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
530                     topicSync->topics = topics;\r
531                     pthread_cond_signal(topicSync->condition);\r
532                     pthread_mutex_unlock(topicSync->mutex);\r
533                 }\r
534                     break;\r
535                 case TAST_GET_CONSUMER_TOPICS:\r
536                 {\r
537                     NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : ");\r
538                     NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
539                     pthread_mutex_lock(topicSync->mutex);\r
540                     NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
541                             consumerTopicList, topicSync->consumerId);\r
542                     topicSync->topics = topics;\r
543                     pthread_cond_signal(topicSync->condition);\r
544                     pthread_mutex_unlock(topicSync->mutex);\r
545                 }\r
546                     break;\r
547                 default:\r
548                     break;\r
549             }\r
550 \r
551             OICFree(node);\r
552         }\r
553 \r
554         pthread_mutex_unlock(&NSMutex[TOPIC_SCHEDULER]);\r
555     }\r
556 \r
557     NS_LOG(DEBUG, "Destroy NSTopicSchedule");\r
558     return NULL;\r
559 }\r