separated the scheduler interface and added callbackresponse.
[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, NSHeadMsg[i]);\r
129             OICFree(temp);\r
130         }\r
131 \r
132         OICFree(NSHeadMsg[i]);\r
133         NSTailMsg[i] = NSHeadMsg[i] = NULL;\r
134 \r
135         pthread_mutex_unlock(&NSMutex[i]);\r
136         pthread_mutex_destroy(&NSMutex[i]);\r
137     }\r
138 \r
139     NS_LOG(DEBUG, "NSStopScheduler - OUT");\r
140 \r
141     return true;\r
142 }\r
143 \r
144 void NSPushQueue(NSSchedulerType schedulerType, NSTaskType taskType, void* data)\r
145 {\r
146 \r
147     if(NSIsRunning[schedulerType] == false)\r
148         return;\r
149 \r
150     pthread_mutex_lock(&NSMutex[schedulerType]);\r
151 \r
152     NS_LOG(DEBUG, "NSPushQueue - IN");\r
153     NS_LOG_V(DEBUG, "NSSchedulerType = %d", schedulerType);\r
154     NS_LOG_V(DEBUG, "NSTaskType = %d", taskType);\r
155 \r
156     if (NSHeadMsg[schedulerType] == NULL)\r
157     {\r
158         NSHeadMsg[schedulerType] = (NSTask*) OICMalloc(sizeof(NSTask));\r
159         memset(NSHeadMsg[schedulerType], 0, 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         memset(newNode, 0, sizeof(NSTask));\r
169         newNode->taskType = taskType;\r
170         newNode->taskData = data;\r
171         newNode->nextTask = NULL;\r
172 \r
173         NSTailMsg[schedulerType]->nextTask = newNode;\r
174         NSTailMsg[schedulerType] = newNode;\r
175     }\r
176 \r
177     sem_post(&(NSSemaphore[schedulerType]));\r
178     NS_LOG(DEBUG, "NSPushQueue - OUT");\r
179     pthread_mutex_unlock(&NSMutex[schedulerType]);\r
180 }\r
181 \r
182 void NSFreeData(NSSchedulerType type, NSTask * task)\r
183 {\r
184     NS_LOG(DEBUG, "NSFreeData - IN");\r
185 \r
186     if (type == CALLBACK_RESPONSE_SCHEDULER)\r
187     {\r
188         switch (task->taskType)\r
189         {\r
190             case TASK_CB_SUBSCRIPTION:\r
191                 NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : Free");\r
192                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
193                 break;\r
194             case TASK_CB_SYNC:\r
195                 NS_LOG(DEBUG, "CASE TASK_CB_SYNC : Free");\r
196                 NSFreeSync((NSSyncInfo*) task->taskData);\r
197                 break;\r
198             default:\r
199                 NS_LOG(DEBUG, "No Task Type");\r
200                 break;\r
201         }\r
202     }\r
203     else if (type == DISCOVERY_SCHEDULER)\r
204     {\r
205         switch (task->taskType)\r
206         {\r
207             case TASK_START_PRESENCE:\r
208             case TASK_STOP_PRESENCE:\r
209             case TASK_REGISTER_RESOURCE:\r
210                 NS_LOG(DEBUG, "Not required Free");\r
211                 break;\r
212             default:\r
213                 NS_LOG(DEBUG, "No Task Type");\r
214                 break;\r
215         }\r
216     }\r
217     else if (type == SUBSCRIPTION_SCHEDULER)\r
218     {\r
219         switch (task->taskType)\r
220         {\r
221             case TASK_SEND_POLICY:\r
222             case TASK_RECV_SUBSCRIPTION:\r
223             case TASK_RECV_UNSUBSCRIPTION:\r
224             case TASK_SYNC_SUBSCRIPTION:\r
225                 NS_LOG(DEBUG, "NSFreeOCEntityHandlerRequest : Free ");\r
226                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
227                 break;\r
228             case TASK_SEND_ALLOW:\r
229             case TASK_SEND_DENY:\r
230                 NS_LOG(DEBUG, "NSFreeConsumer : Free ");\r
231                 NSFreeConsumer((NSConsumer *) task->taskData);\r
232                 break;\r
233             default:\r
234                 NS_LOG(DEBUG, "No Task Type");\r
235                 break;\r
236         }\r
237     }\r
238     else if (type == NOTIFICATION_SCHEDULER)\r
239     {\r
240         switch (task->taskType)\r
241         {\r
242             case TASK_SEND_NOTIFICATION:\r
243             {\r
244                 NS_LOG(DEBUG, "NSFreeMessage : Free ");\r
245                 NSFreeMessage((NSMessage *)task->taskData);\r
246                 break;\r
247             }\r
248             case TASK_SEND_READ:\r
249             case TASK_RECV_READ:\r
250                 NS_LOG(DEBUG, "NSFreeSync : Free ");\r
251                 NSFreeSync((NSSyncInfo*) task->taskData);\r
252                 break;\r
253 \r
254             default:\r
255                 NS_LOG(DEBUG, "No Task Type");\r
256                 break;\r
257         }\r
258     }\r
259 \r
260     NS_LOG(DEBUG, "NSFreeData - OUT");\r
261 }\r