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