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);\r
311             topics = next;\r
312         }\r
313 \r
314         OCRepPayloadSetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
315                 (const OCRepPayload**) (payloadTopicArray), dimensions);\r
316     }\r
317     else\r
318     {\r
319         size_t dimensions[3] = { 0, 0, 0 };\r
320 \r
321         OCRepPayloadSetPropObjectArrayAsOwner(payload, NS_ATTRIBUTE_TOPIC_LIST,\r
322                 (OCRepPayload **) NULL, dimensions);\r
323     }\r
324 \r
325     copyReq = OICStrdup(entityHandlerRequest->query);\r
326     char * reqInterface = NSGetValueFromQuery(copyReq, NS_QUERY_INTERFACE);\r
327 \r
328     if (reqInterface && strcmp(reqInterface, NS_INTERFACE_BASELINE) == 0)\r
329     {\r
330         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_BASELINE);\r
331         OCResourcePayloadAddStringLL(&payload->interfaces, NS_INTERFACE_READ);\r
332         OCResourcePayloadAddStringLL(&payload->types, NS_ROOT_TYPE);\r
333     }\r
334     OICFree(copyReq);\r
335 \r
336     response.requestHandle = entityHandlerRequest->requestHandle;\r
337     response.resourceHandle = entityHandlerRequest->resource;\r
338     response.persistentBufferFlag = 0;\r
339     response.ehResult = OC_EH_OK;\r
340     response.payload = (OCPayload *) payload;\r
341 \r
342     if (OCDoResponse(&response) != OC_STACK_OK)\r
343     {\r
344         NS_LOG(ERROR, "Fail to response topic list");\r
345         return NS_ERROR;\r
346     }\r
347     OCRepPayloadDestroy(payload);\r
348 \r
349     NS_LOG(DEBUG, "NSSendTopicList - OUT");\r
350     return NS_OK;\r
351 }\r
352 \r
353 NSResult NSPostConsumerTopics(OCEntityHandlerRequest * entityHandlerRequest)\r
354 {\r
355     NS_LOG(DEBUG, "NSPostConsumerTopics() - IN");\r
356 \r
357     char * consumerId = NULL;\r
358     OCRepPayload * payload = (OCRepPayload *) entityHandlerRequest->payload;\r
359     OCRepPayloadGetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, &consumerId);\r
360 \r
361     if (!consumerId)\r
362     {\r
363         NS_LOG(DEBUG, "Invalid consumer ID");\r
364         return NS_FAIL;\r
365     }\r
366 \r
367     NS_LOG_V(DEBUG, "TOPIC consumer ID = %s", consumerId);\r
368 \r
369     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_CID;\r
370
371     while (NSProviderStorageDelete(consumerTopicList, consumerId) != NS_FAIL)\r
372     {\r
373     }\r
374     consumerTopicList->cacheType = NS_PROVIDER_CACHE_CONSUMER_TOPIC_NAME;\r
375 \r
376     OCRepPayload ** topicListPayload = NULL;\r
377     OCRepPayloadValue * payloadValue = NULL;\r
378     payloadValue = NSPayloadFindValue(payload, NS_ATTRIBUTE_TOPIC_LIST);\r
379     size_t dimensionSize = calcDimTotal(payloadValue->arr.dimensions);\r
380     size_t dimensions[3] = { dimensionSize, 0, 0 };\r
381     OCRepPayloadGetPropObjectArray(payload, NS_ATTRIBUTE_TOPIC_LIST, &topicListPayload, dimensions);\r
382 \r
383     for (int i = 0; i < (int) dimensionSize; i++)\r
384     {\r
385         char * topicName = NULL;\r
386         int64_t topicState = 0;\r
387 \r
388         OCRepPayloadGetPropString(topicListPayload[i], NS_ATTRIBUTE_TOPIC_NAME, &topicName);\r
389         OCRepPayloadGetPropInt(topicListPayload[i], NS_ATTRIBUTE_TOPIC_SELECTION, &topicState);\r
390         NS_LOG_V(DEBUG, "Topic Name(state):  %s(%d)", topicName, (int)topicState);\r
391 \r
392         if (NS_TOPIC_SUBSCRIBED == (NSTopicState) topicState)\r
393         {\r
394             NSCacheTopicSubData * topicSubData = (NSCacheTopicSubData *) OICMalloc(\r
395                     sizeof(NSCacheTopicSubData));\r
396             NS_VERIFY_NOT_NULL(topicSubData, NS_FAIL);\r
397 \r
398             OICStrcpy(topicSubData->id, NS_UUID_STRING_SIZE, consumerId);\r
399             topicSubData->topicName = topicName;\r
400 \r
401             NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
402 \r
403             if (!newObj)\r
404             {\r
405                 OICFree(topicSubData->topicName);\r
406                 OICFree(topicSubData);\r
407                 OICFree(consumerId);\r
408                 return NS_FAIL;\r
409             }\r
410 \r
411             newObj->data = (NSCacheData *) topicSubData;\r
412             newObj->next = NULL;\r
413 \r
414             NSProviderStorageWrite(consumerTopicList, newObj);
415         }\r
416     }\r
417     NSSendTopicUpdationToConsumer(consumerId);\r
418     OICFree(consumerId);\r
419     NS_LOG(DEBUG, "NSPostConsumerTopics() - OUT");\r
420     return NS_OK;\r
421 }\r
422 \r
423 void * NSTopicSchedule(void * ptr)\r
424 {\r
425     if (ptr == NULL)\r
426     {\r
427         NS_LOG(DEBUG, "Create NSTopicSchedule");\r
428     }\r
429 \r
430     while (NSIsRunning[TOPIC_SCHEDULER])\r
431     {\r
432         sem_wait(&NSSemaphore[TOPIC_SCHEDULER]);\r
433         pthread_mutex_lock(&NSMutex[TOPIC_SCHEDULER]);\r
434 \r
435         if (NSHeadMsg[TOPIC_SCHEDULER] != NULL)\r
436         {\r
437             NSTask *node = NSHeadMsg[TOPIC_SCHEDULER];\r
438             NSHeadMsg[TOPIC_SCHEDULER] = node->nextTask;\r
439 \r
440             switch (node->taskType)\r
441             {\r
442                 case TASK_SEND_TOPICS:\r
443                     NS_LOG(DEBUG, "CASE TASK_SEND_TOPICS : ");\r
444                     NSSendTopicList((OCEntityHandlerRequest*) node->taskData);\r
445                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
446                     break;\r
447                 case TASK_SUBSCRIBE_TOPIC:\r
448                 {\r
449                     NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPIC : ");\r
450                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
451                     pthread_mutex_lock(topicSyncResult->mutex);\r
452                     NSCacheElement * newObj = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
453                     NSCacheTopicSubData * subData =\r
454                             (NSCacheTopicSubData *) topicSyncResult->topicData;\r
455                     if (!newObj)\r
456                     {\r
457                         OICFree(subData->topicName);\r
458                         OICFree(subData);\r
459                         pthread_cond_signal(topicSyncResult->condition);\r
460                         pthread_mutex_unlock(topicSyncResult->mutex);\r
461                     }\r
462                     else\r
463                     {\r
464                         if (NSProviderStorageRead(registeredTopicList, subData->topicName))\r
465                         {\r
466                             newObj->data = topicSyncResult->topicData;\r
467                             newObj->next = NULL;\r
468                             NSProviderStorageWrite(consumerTopicList, newObj);\r
469                             NSSendTopicUpdationToConsumer(subData->id);\r
470                             topicSyncResult->result = NS_OK;\r
471                         }\r
472                     }\r
473                     pthread_cond_signal(topicSyncResult->condition);\r
474                     pthread_mutex_unlock(topicSyncResult->mutex);\r
475
476                 }\r
477                     break;\r
478                 case TASK_UNSUBSCRIBE_TOPIC:\r
479                 {\r
480                     NS_LOG(DEBUG, "CASE TASK_UNSUBSCRIBE_TOPIC : ");\r
481                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
482                     pthread_mutex_lock(topicSyncResult->mutex);\r
483                     NSCacheTopicSubData * topicSubData =\r
484                             (NSCacheTopicSubData *) topicSyncResult->topicData;\r
485                     if (NSProviderDeleteConsumerTopic(consumerTopicList, topicSubData) == NS_OK)\r
486                     {\r
487                         NSSendTopicUpdationToConsumer(topicSubData->id);\r
488                         topicSyncResult->result = NS_OK;\r
489                     }\r
490                     OICFree(topicSubData->topicName);\r
491                     OICFree(topicSubData);\r
492                     pthread_cond_signal(topicSyncResult->condition);\r
493                     pthread_mutex_unlock(topicSyncResult->mutex);\r
494 \r
495                 }\r
496                     break;\r
497                 case TASK_REGISTER_TOPIC:\r
498                 {\r
499                     NS_LOG(DEBUG, "CASE TASK_ADD_TOPIC : ");\r
500                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
501 \r
502                     pthread_mutex_lock(topicSyncResult->mutex);\r
503                     topicSyncResult->result = NSRegisterTopic(\r
504                             (const char *) topicSyncResult->topicData);\r
505                     pthread_cond_signal(topicSyncResult->condition);\r
506                     pthread_mutex_unlock(topicSyncResult->mutex);\r
507                 }\r
508                     break;\r
509                 case TASK_UNREGISTER_TOPIC:\r
510                 {\r
511                     NS_LOG(DEBUG, "CASE_TASK_DELETE_TOPIC : ");\r
512                     NSTopicSyncResult * topicSyncResult = (NSTopicSyncResult *) node->taskData;\r
513                     pthread_mutex_lock(topicSyncResult->mutex);\r
514                     topicSyncResult->result = NSUnregisterTopic(\r
515                             (const char *) topicSyncResult->topicData);\r
516                     pthread_cond_signal(topicSyncResult->condition);\r
517                     pthread_mutex_unlock(topicSyncResult->mutex);\r
518                 }\r
519                     break;\r
520                 case TASK_POST_TOPIC:\r
521                 {\r
522                     NS_LOG(DEBUG, "TASK_POST_TOPIC : ");\r
523                     NSPostConsumerTopics((OCEntityHandlerRequest*) node->taskData);\r
524                     NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) node->taskData);\r
525                 }\r
526                     break;\r
527                 case TASK_GET_TOPICS:\r
528                 {\r
529                     NS_LOG(DEBUG, "TASK_GET_TOPICS : ");\r
530                     NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
531                     pthread_mutex_lock(topicSync->mutex);\r
532                     NSTopicLL * topics = NSProviderGetTopicsCacheData(registeredTopicList);\r
533                     topicSync->topics = topics;\r
534                     pthread_cond_signal(topicSync->condition);\r
535                     pthread_mutex_unlock(topicSync->mutex);\r
536                 }\r
537                     break;\r
538                 case TAST_GET_CONSUMER_TOPICS:\r
539                 {\r
540                     NS_LOG(DEBUG, "TASK_GET_CONSUMER_TOPICS : ");\r
541                     NSTopicSync * topicSync = (NSTopicSync *) node->taskData;\r
542                     pthread_mutex_lock(topicSync->mutex);\r
543                     NSTopicLL * topics = NSProviderGetConsumerTopicsCacheData(registeredTopicList,\r
544                             consumerTopicList, topicSync->consumerId);\r
545                     topicSync->topics = topics;\r
546                     pthread_cond_signal(topicSync->condition);\r
547                     pthread_mutex_unlock(topicSync->mutex);\r
548                 }\r
549                     break;\r
550                 default:\r
551                     break;\r
552             }\r
553 \r
554             OICFree(node);\r
555         }\r
556 \r
557         pthread_mutex_unlock(&NSMutex[TOPIC_SCHEDULER]);\r
558     }\r
559 \r
560     NS_LOG(DEBUG, "Destroy NSTopicSchedule");\r
561     return NULL;\r
562 }\r