fb4933735a856cb7e88425359775ee5358ea6ebd
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderScheduler.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 "NSProviderScheduler.h"\r
22 \r
23 pthread_t NSThread[THREAD_COUNT];\r
24 pthread_mutex_t NSMutex[THREAD_COUNT];\r
25 sem_t NSSemaphore[THREAD_COUNT];\r
26 bool NSIsRunning[THREAD_COUNT] = { false, };\r
27 \r
28 NSTask* NSHeadMsg[THREAD_COUNT];\r
29 NSTask* NSTailMsg[THREAD_COUNT];\r
30 \r
31 void * NSCallbackResponseSchedule(void *ptr);\r
32 void * NSDiscoverySchedule(void *ptr);\r
33 void * NSSubScriptionSchedule(void *ptr);\r
34 void * NSNotificationSchedule(void *ptr);\r
35 void * NSTopicSchedule(void * ptr);\r
36 \r
37 bool NSInitScheduler()\r
38 {\r
39     NS_LOG(DEBUG, "NSInitScheduler - IN");\r
40 \r
41     int i = 0;\r
42 \r
43     for (i = 0; i < THREAD_COUNT; i++)\r
44     {\r
45         pthread_mutex_init(&NSMutex[i], NULL);\r
46         NSIsRunning[i] = true;\r
47         sem_init(&(NSSemaphore[i]), 0, 0);\r
48     }\r
49 \r
50     NS_LOG(DEBUG, "NSInitScheduler - OUT");\r
51 \r
52     return true;\r
53 }\r
54 \r
55 bool NSStartScheduler()\r
56 {\r
57     int i = 0;\r
58 \r
59     for (i = 0; i < THREAD_COUNT; i++)\r
60     {\r
61         pthread_mutex_lock(&NSMutex[i]);\r
62 \r
63         switch (i)\r
64         {\r
65             case CALLBACK_RESPONSE_SCHEDULER:\r
66             {\r
67                 NS_LOG(DEBUG, "CASE RESPONSE_SCHEDULER :");\r
68                 pthread_create(&NSThread[i], NULL, NSCallbackResponseSchedule, NULL);\r
69             }\r
70                 break;\r
71 \r
72             case DISCOVERY_SCHEDULER:\r
73             {\r
74                 NS_LOG(DEBUG, "CASE DISCOVERY_SCHEDULER :");\r
75                 pthread_create(&NSThread[i], NULL, NSDiscoverySchedule, NULL);\r
76             }\r
77                 break;\r
78 \r
79             case SUBSCRIPTION_SCHEDULER:\r
80             {\r
81                 NS_LOG(DEBUG, "CASE SUBSCRIPTION_SCHEDULER :");\r
82                 pthread_create(&NSThread[i], NULL, NSSubScriptionSchedule, NULL);\r
83             }\r
84                 break;\r
85 \r
86             case NOTIFICATION_SCHEDULER:\r
87             {\r
88                 NS_LOG(DEBUG, "CASE NOTIFICATION_SCHEDULER :");\r
89                 pthread_create(&NSThread[i], NULL, NSNotificationSchedule, NULL);\r
90             }\r
91                 break;\r
92 \r
93             case TOPIC_SCHEDULER:\r
94             {\r
95                 NS_LOG(DEBUG, "CASE TOPIC_SCHEDULER :");\r
96                 pthread_create(&NSThread[i], NULL, NSTopicSchedule, NULL);\r
97             }\r
98                 break;\r
99             default:\r
100                 break;\r
101 \r
102         }\r
103 \r
104         NSHeadMsg[i] = NSTailMsg[i] = NULL;\r
105 \r
106         pthread_mutex_unlock(&NSMutex[i]);\r
107 \r
108     }\r
109 \r
110     return true;\r
111 }\r
112 \r
113 bool NSStopScheduler()\r
114 {\r
115     NS_LOG(DEBUG, "NSStopScheduler - IN");\r
116     int i = 0;\r
117 \r
118     for (i = THREAD_COUNT - 1; i >= 0; --i)\r
119     {\r
120         int status = -1;\r
121 \r
122         NSIsRunning[i] = false;\r
123 \r
124         sem_post(&(NSSemaphore[i]));\r
125         pthread_join(NSThread[i], (void **) &status);\r
126 \r
127         NSThread[i] = 0;\r
128 \r
129         pthread_mutex_lock(&NSMutex[i]);\r
130 \r
131         while (NSHeadMsg[i] != NULL)\r
132         {\r
133             NSTask* temp = NSHeadMsg[i];\r
134             NSHeadMsg[i] = NSHeadMsg[i]->nextTask;\r
135             NSFreeData(i, temp);\r
136             OICFree(temp);\r
137         }\r
138 \r
139         NSTailMsg[i] = NSHeadMsg[i] = NULL;\r
140 \r
141         pthread_mutex_unlock(&NSMutex[i]);\r
142         pthread_mutex_destroy(&NSMutex[i]);\r
143     }\r
144 \r
145     NS_LOG(DEBUG, "NSStopScheduler - OUT");\r
146 \r
147     return true;\r
148 }\r
149 \r
150 void NSPushQueue(NSSchedulerType schedulerType, NSTaskType taskType, void* data)\r
151 {\r
152 \r
153     if(!NSIsRunning[schedulerType])\r
154     {\r
155         return;\r
156     }\r
157 \r
158     pthread_mutex_lock(&NSMutex[schedulerType]);\r
159 \r
160     NS_LOG(DEBUG, "NSPushQueue - IN");\r
161     NS_LOG_V(DEBUG, "NSSchedulerType = %d", schedulerType);\r
162     NS_LOG_V(DEBUG, "NSTaskType = %d", taskType);\r
163 \r
164     if (NSHeadMsg[schedulerType] == NULL)\r
165     {\r
166         NSHeadMsg[schedulerType] = (NSTask*) OICMalloc(sizeof(NSTask));\r
167         if(NSHeadMsg[schedulerType])\r
168         {\r
169             NSHeadMsg[schedulerType]->taskType = taskType;\r
170             NSHeadMsg[schedulerType]->taskData = data;\r
171             NSHeadMsg[schedulerType]->nextTask = NULL;\r
172             NSTailMsg[schedulerType] = NSHeadMsg[schedulerType];\r
173         }\r
174     }\r
175     else\r
176     {\r
177         NSTask* newNode = (NSTask*) OICMalloc(sizeof(NSTask));\r
178         if(newNode)\r
179         {\r
180             newNode->taskType = taskType;\r
181             newNode->taskData = data;\r
182             newNode->nextTask = NULL;\r
183 \r
184             NSTailMsg[schedulerType]->nextTask = newNode;\r
185             NSTailMsg[schedulerType] = newNode;\r
186         }\r
187     }\r
188 \r
189     sem_post(&(NSSemaphore[schedulerType]));\r
190     NS_LOG(DEBUG, "NSPushQueue - OUT");\r
191     pthread_mutex_unlock(&NSMutex[schedulerType]);\r
192 }\r
193 \r
194 void NSFreeData(NSSchedulerType type, NSTask * task)\r
195 {\r
196     NS_LOG(DEBUG, "NSFreeData - IN");\r
197 \r
198     if (type == CALLBACK_RESPONSE_SCHEDULER)\r
199     {\r
200         switch (task->taskType)\r
201         {\r
202             case TASK_CB_SUBSCRIPTION:\r
203                 NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : Free");\r
204                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
205                 break;\r
206             case TASK_CB_SYNC:\r
207                 NS_LOG(DEBUG, "CASE TASK_CB_SYNC : Free");\r
208                 NSFreeSync((NSSyncInfo*) task->taskData);\r
209                 break;\r
210             default:\r
211                 NS_LOG(DEBUG, "No Task Type");\r
212                 break;\r
213         }\r
214     }\r
215     else if (type == DISCOVERY_SCHEDULER)\r
216     {\r
217         switch (task->taskType)\r
218         {\r
219             case TASK_START_PRESENCE:\r
220             case TASK_STOP_PRESENCE:\r
221             case TASK_REGISTER_RESOURCE:\r
222                 NS_LOG(DEBUG, "Not required Free");\r
223                 break;\r
224             default:\r
225                 NS_LOG(DEBUG, "No Task Type");\r
226                 break;\r
227         }\r
228     }\r
229     else if (type == SUBSCRIPTION_SCHEDULER)\r
230     {\r
231         switch (task->taskType)\r
232         {\r
233             case TASK_SEND_POLICY:\r
234             case TASK_RECV_SUBSCRIPTION:\r
235             case TASK_RECV_UNSUBSCRIPTION:\r
236             case TASK_SYNC_SUBSCRIPTION:\r
237                 NS_LOG(DEBUG, "NSFreeOCEntityHandlerRequest : Free ");\r
238                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
239                 break;\r
240             case TASK_SEND_ALLOW:\r
241             case TASK_SEND_DENY:\r
242                 NS_LOG(DEBUG, "NSFreeConsumer : Free ");\r
243                 NSFreeConsumer((NSConsumer *) task->taskData);\r
244                 break;\r
245             default:\r
246                 NS_LOG(DEBUG, "No Task Type");\r
247                 break;\r
248         }\r
249     }\r
250     else if (type == NOTIFICATION_SCHEDULER)\r
251     {\r
252         switch (task->taskType)\r
253         {\r
254             case TASK_SEND_NOTIFICATION:\r
255             {\r
256                 NS_LOG(DEBUG, "NSFreeMessage : Free ");\r
257                 NSFreeMessage((NSMessage *)task->taskData);\r
258                 break;\r
259             }\r
260             case TASK_SEND_READ:\r
261             case TASK_RECV_READ:\r
262                 NS_LOG(DEBUG, "NSFreeSync : Free ");\r
263                 NSFreeSync((NSSyncInfo*) task->taskData);\r
264                 break;\r
265 \r
266             default:\r
267                 NS_LOG(DEBUG, "No Task Type");\r
268                 break;\r
269         }\r
270     }\r
271     else if (type == TOPIC_SCHEDULER)\r
272     {\r
273         switch (task->taskType)\r
274         {\r
275             case TASK_SUBSCRIBE_TOPIC:\r
276             case TASK_UNSUBSCRIBE_TOPIC:\r
277             {\r
278                 NSCacheTopicSubData * data = task->taskData;\r
279                 OICFree(data->topicName);\r
280                 OICFree(data);\r
281             }\r
282                 break;\r
283             case TASK_REGISTER_TOPIC:\r
284             case TASK_UNREGISTER_TOPIC:\r
285             {\r
286                 OICFree(task->taskData);\r
287             }\r
288                 break;\r
289             case TASK_SEND_TOPICS:\r
290             case TASK_POST_TOPIC:\r
291             {\r
292                 NS_LOG(DEBUG, "TASK_POST_TOPIC : ");\r
293                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
294             }\r
295                 break;\r
296             default:\r
297                 break;\r
298         }\r
299     }\r
300     NS_LOG(DEBUG, "NSFreeData - OUT");\r
301 }\r