bug fix about memory leak.
[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 * copyReq = OICStrdup(entityHandlerRequest->query);\r
239     char * id = NSGetValueFromQuery(copyReq, NS_QUERY_CONSUMER_ID);\r
240     NSTopicLL * topics = NULL;\r
241 \r
242     if (!id)\r
243     {\r
244         NS_LOG(DEBUG, "Send registered topic list");\r
245         topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
246     }\r
247     else\r
248     {\r
249         NS_LOG(DEBUG, "Send subscribed topic list to consumer");\r
250         topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList, consumerTopicList, id);\r
251         if (!topics)\r
252         {\r
253             topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
254         }\r
255     }\r
256 \r
257     // make response for the Get Request\r
258     OCEntityHandlerResponse response;\r
259     response.numSendVendorSpecificHeaderOptions = 0;\r
260     memset(response.sendVendorSpecificHeaderOptions, 0,\r
261             sizeof response.sendVendorSpecificHeaderOptions);\r
262     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
263 \r
264     OCRepPayload* payload = OCRepPayloadCreate();\r
265     if (!payload)\r
266     {\r
267         NS_LOG(ERROR, "payload is NULL");\r
268         OICFree(copyReq);\r
269         return NS_ERROR;\r
270     }\r
271 \r
272     OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
273     if (id)\r
274     {\r
275         OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
276     }\r
277     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
278     OICFree(copyReq);\r
279 \r
280     if (topics)\r
281     {\r
282         NS_LOG(DEBUG, "topicList is NULL");\r
283         size_t dimensionSize = (size_t) NSProviderGetTopicListSize(topics);\r
284         NS_LOG_V(DEBUG, "dimensionSize = %d", (int)dimensionSize);\r
285 \r
286         if (!dimensionSize)\r
287         {\r
288             return NS_ERROR;\r
289         }\r
290 \r
291         OCRepPayload** payloadTopicArray = (OCRepPayload **) OICMalloc(\r
292                 sizeof(OCRepPayload *) * dimensionSize);\r
293         NS_VERIFY_NOT_NULL(payloadTopicArray, NS_ERROR);\r
294 \r
295         size_t dimensions[3] = { dimensionSize, 0, 0 };\r
296 \r
297         for (int i = 0; i < (int) dimensionSize; i++)\r
298         {\r
299             NS_LOG_V(DEBUG, "topicName = %s", topics->topicName);\r
300             NS_LOG_V(DEBUG, "topicState = %d",(int) topics->state);\r
301 \r
302             payloadTopicArray[i] = OCRepPayloadCreate();\r
303             NS_VERIFY_NOT_NULL(payloadTopicArray[i], NS_ERROR);\r
304             OCRepPayloadSetPropString(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_NAME,\r
305                     topics->topicName);\r
306             OCRepPayloadSetPropInt(payloadTopicArray[i], NS_ATTRIBUTE_TOPIC_SELECTION,\r
307                     (int) topics->state);\r
308 \r
309             NSTopicLL * next = topics->next;\r
310             OICFree(topics->topicName);\r
311             OICFree(topics);\r
312             topics = next;\r
313         }\r
314 \r
315         OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
316                 (const OCRepPayload**) (payloadTopicArray), dimensions);\r
317         for (int i = 0; i < (int) dimensionSize; ++i)\r
318         {\r
319             OCRepPayloadDestroy(payloadTopicArray[i]);\r
320         }\r
321         OICFree(payloadTopicArray);\r
322     }\r
323     else\r
324     {\r
325         size_t dimensions[3] = { 0, 0, 0 };\r
326 \r
327         OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
328                 (OCRepPayload **) NULL, dimensions);\r
329     }\r
330 \r
331     copyReq = OICStrdup(entityHandlerRequest->query);\r
332     char * reqInterface = NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE);\r
333 \r
334     if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
335     {\r
336         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
337         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
338         OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
339     }\r
340     OICFree(copyReq);\r
341 \r
342     response.requestHandle = entityHandlerRequest->requestHandle;\r
343     response.resourceHandle = entityHandlerRequest->resource;\r
344     response.persistentBufferFlag = 0;\r
345     response.ehResult = OC_EH_OK;\r
346     response.payload = (OCPayload *) payload;\r
347 \r
348     if (OCDoResponse(&response) != OC_STACK_OK)\r
349     {\r
350         NS_LOG(ERROR, "Fail to response topic list");\r
351         OCRepPayloadDestroy(payload);\r
352         return NS_ERROR;\r
353     }\r
354 \r
355     OCRepPayloadDestroy(payload);\r
356     NS_LOG(DEBUG, "NSSendTopicList - OUT");\r
357     return NS_OK;\r
358 }\r
359 \r
360 NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)\r
361 {\r
362     NS_LOG(DEBUG, "NSPostConsumerTopics() - IN");\r
363 \r
364     char * consumerId = NULL;\r
365     OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload;\r
366     OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId);\r
367 \r
368     if (!consumerId)\r
369     {\r
370         NS_LOG(DEBUG, "Invalid consumer ID");\r
371         return NS_FAIL;\r
372     }\r
373 \r
374     NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId);\r
375 \r
376     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
377
378     while (NSProviderStorageDelete(consumerTopicList, consumerId) != NS_FAIL)\r
379     {\r
380     }\r
381     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
382 \r
383     OCRepPayload ** topicListPayload = NULL;\r
384     OCRepPayloadValue * payloadValue = NULL;\r
385     payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
386     size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
387     size_t dimensions[3] = { dimensionSize, 0, 0 };\r
388     OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, dimensions);\r
389 \r
390     for (int i = 0; i < (int) dimensionSize; i++)\r
391     {\r
392         char * topicName = NULL;\r
393         int64_t topicState = 0;\r
394 \r
395         OCRepPayloadGetPropString(topicListPayload[i], NS_ATTRIBUTE_TOPIC_NAME, &topicName);\r
396         OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &topicState);\r
397         NS_LOG_V(DEBUG, "Topic Name(state):  %s(%d)", topicName, (int)topicState);\r
398 \r
399         if (NS_TOPIC_SUBSCRIBED == (NSTopicState) topicState)\r
400         {\r
401             NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) OICMalloc(\r
402                     sizeof(NSCacheTopicSubData));\r
403             NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL);\r
404 \r
405             OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
406             topicSubData->topicName = topicName;\r
407 \r
408             NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
409 \r
410             if (!newObj)\r
411             {\r
412                 OICFree(topicSubData->topicName);\r
413                 OICFree(topicSubData);\r
414                 OICFree(consumerId);\r
415                 return NS_FAIL;\r
416             }\r
417 \r
418             newObj->data = (NSCacheData *) topicSubData;\r
419             newObj->next = NULL;\r
420 \r
421             NSProviderStorageWrite(consumerTopicList, newObj);
422         }\r
423     }\r
424     NSSendTopicUpdationToConsumer(consumerId);\r
425     OICFree(consumerId);\r
426     NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
427     return NS_OK;\r
428 }\r
429 \r
430 void * NSTopicSchedule(void * ptr)\r
431 {\r
432     if (ptr == NULL)\r
433     {\r
434         NS_LOG(DEBUG, "Create NSTopicSchedule");\r
435     }\r
436 \r
437     while (NSIsRunning[TOPIC_SCHEDULER])\r
438     {\r
439         sem_wait(&NSSemaphore[TOPIC_SCHEDULER]);\r
440         pthread_mutex_lock(&NSMutex[TOPIC_SCHEDULER]);\r
441 \r
442         if (NSHeadMsg[TOPIC_SCHEDULER] != NULL)\r
443         {\r
444             NSTask *node = NSHeadMsg[TOPIC_SCHEDULER];\r
445             NSHeadMsg[TOPIC_SCHEDULER] = node->nextTask;\r
446 \r
447             switch (node->taskType)\r
448             {\r
449                 case TASK_SEND_TOPICS:\r
450                     NS_LOG(DEBUG, "CASE TASK_SEND_TOPICS : ");\r
451                     NSSendTopicList((OCEntityHandlerRequest*) node->taskData);\r
452                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
453                     break;\r
454                 case TASK_SUBSCRIBE_TOPIC:\r
455                 {\r
456                     NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
457                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
458                     pthread_mutex_lock(topicSyncResult->mutex);\r
459                     NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
460                     NSCacheTopicSubData * subData =\r
461                             (NSCacheTopicSubData *) topicSyncResult->topicData;\r
462                     if (!newObj)\r
463                     {\r
464                         OICFree(subData->topicName);\r
465                         OICFree(subData);\r
466                         pthread_cond_signal(topicSyncResult->condition);\r
467                         pthread_mutex_unlock(topicSyncResult->mutex);\r
468                     }\r
469                     else\r
470                     {\r
471                         if (NSProviderStorageRead(registeredTopicList, subData->topicName))\r
472                         {\r
473                             newObj->data = topicSyncResult->topicData;\r
474                             newObj->next = NULL;\r
475                             if(NSProviderStorageWrite(consumerTopicList, newObj) == NS_OK)\r
476                             {\r
477                                 NSSendTopicUpdationToConsumer(subData->id);\r
478                                 topicSyncResult->result = NS_OK;\r
479                             }\r
480                         }\r
481                         else\r
482                         {\r
483                             OICFree(subData->topicName);\r
484                             OICFree(subData);\r
485                             OICFree(newObj);\r
486                         }\r
487                     }\r
488                     pthread_cond_signal(topicSyncResult->condition);\r
489                     pthread_mutex_unlock(topicSyncResult->mutex);
490                 }\r
491                     break;\r
492                 case TASK_UNSUBSCRIBE_TOPIC:\r
493                 {\r
494                     NS_LOG(DEBUG, "CASE TASK_UNSUBSCRIBE_TOPIC : ");\r
495                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
496                     pthread_mutex_lock(topicSyncResult->mutex);\r
497                     NSCacheTopicSubData * topicSubData =\r
498                             (NSCacheTopicSubData *) topicSyncResult->topicData;\r
499                     if (NSProviderDeleteConsumerTopic(consumerTopicList, topicSubData) == NS_OK)\r
500                     {\r
501                         NSSendTopicUpdationToConsumer(topicSubData->id);\r
502                         topicSyncResult->result = NS_OK;\r
503                     }\r
504                     OICFree(topicSubData->topicName);\r
505                     OICFree(topicSubData);\r
506                     pthread_cond_signal(topicSyncResult->condition);\r
507                     pthread_mutex_unlock(topicSyncResult->mutex);\r
508 \r
509                 }\r
510                     break;\r
511                 case TASK_REGISTER_TOPIC:\r
512                 {\r
513                     NS_LOG(DEBUG, "CASE TASK_ADD_TOPIC : ");\r
514                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
515 \r
516                     pthread_mutex_lock(topicSyncResult->mutex);\r
517                     topicSyncResult->result = NSRegisterTopic(\r
518                             (const char *) topicSyncResult->topicData);\r
519                     pthread_cond_signal(topicSyncResult->condition);\r
520                     pthread_mutex_unlock(topicSyncResult->mutex);\r
521                 }\r
522                     break;\r
523                 case TASK_UNREGISTER_TOPIC:\r
524                 {\r
525                     NS_LOG(DEBUG, "CASE_TASK_DELETE_TOPIC : ");\r
526                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
527                     pthread_mutex_lock(topicSyncResult->mutex);\r
528                     topicSyncResult->result = NSUnregisterTopic(\r
529                             (const char *) topicSyncResult->topicData);\r
530                     pthread_cond_signal(topicSyncResult->condition);\r
531                     pthread_mutex_unlock(topicSyncResult->mutex);\r
532                 }\r
533                     break;\r
534                 case TASK_POST_TOPIC:\r
535                 {\r
536                     NS_LOG(DEBUG, "TASK_POST_TOPIC : ");\r
537                     NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData);\r
538                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
539                 }\r
540                     break;\r
541                 case TASK_GET_TOPICS:\r
542                 {\r
543                     NS_LOG(DEBUG, "TASK_GET_TOPICS : ");\r
544                     NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
545                     pthread_mutex_lock(topicSync->mutex);\r
546                     NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
547                     topicSync->topics = topics;\r
548                     pthread_cond_signal(topicSync->condition);\r
549                     pthread_mutex_unlock(topicSync->mutex);\r
550                 }\r
551                     break;\r
552                 case TAST_GET_CONSUMER_TOPICS:\r
553                 {\r
554                     NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : ");\r
555                     NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
556                     pthread_mutex_lock(topicSync->mutex);\r
557                     NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
558                             consumerTopicList, topicSync->consumerId);\r
559                     topicSync->topics = topics;\r
560                     pthread_cond_signal(topicSync->condition);\r
561                     pthread_mutex_unlock(topicSync->mutex);\r
562                 }\r
563                     break;\r
564                 default:\r
565                     break;\r
566             }\r
567 \r
568             OICFree(node);\r
569         }\r
570 \r
571         pthread_mutex_unlock(&NSMutex[TOPIC_SCHEDULER]);\r
572     }\r
573 \r
574     NS_LOG(DEBUG, "Destroy NSTopicSchedule");\r
575     return NULL;\r
576 }\r