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