added struct, enum and modified struct, enum
[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 NSTask* NSTailMsg[THREAD_COUNT];\r
31 \r
32 void * NSInterfaceSchedule(void *ptr);\r
33 void * NSDiscoverySchedule(void *ptr);\r
34 void * NSSubScriptionSchedule(void *ptr);\r
35 void * NSNotificationSchedule(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 INTERFACE_SCHEDULER:\r
66             {\r
67                 NS_LOG(DEBUG, "CASE RESPONSE_SCHEDULER :");\r
68                 pthread_create(&NSThread[i], NULL, NSInterfaceSchedule, 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             default:\r
94                 break;\r
95 \r
96         }\r
97 \r
98         NSHeadMsg[i] = NSTailMsg[i] = NULL;\r
99 \r
100         pthread_mutex_unlock(&NSMutex[i]);\r
101 \r
102     }\r
103 \r
104     return true;\r
105 }\r
106 \r
107 bool NSStopScheduler()\r
108 {\r
109     NS_LOG(DEBUG, "NSStopScheduler - IN");\r
110     int i = 0;\r
111 \r
112     for (i = THREAD_COUNT - 1; i >= 0; --i)\r
113     {\r
114         int status = -1;\r
115 \r
116         NSIsRunning[i] = false;\r
117 \r
118         sem_post(&(NSSemaphore[i]));\r
119         pthread_join(NSThread[i], (void **) &status);\r
120 \r
121         NSThread[i] = 0;\r
122 \r
123         pthread_mutex_lock(&NSMutex[i]);\r
124 \r
125         while (NSHeadMsg[i] != NULL)\r
126         {\r
127             NSTask* temp = NSHeadMsg[i];\r
128             NSHeadMsg[i] = NSHeadMsg[i]->nextTask;\r
129             NSFreeData(i, NSHeadMsg[i]);\r
130             OICFree(temp);\r
131         }\r
132 \r
133         OICFree(NSHeadMsg[i]);\r
134         NSTailMsg[i] = NSHeadMsg[i] = NULL;\r
135 \r
136         pthread_mutex_unlock(&NSMutex[i]);\r
137         pthread_mutex_destroy(&NSMutex[i]);\r
138     }\r
139 \r
140     NS_LOG(DEBUG, "NSStopScheduler - OUT");\r
141 \r
142     return true;\r
143 }\r
144 \r
145 void NSPushQueue(NSSchedulerType schedulerType, NSTaskType taskType, void* data)\r
146 {\r
147 \r
148     if(NSIsRunning[schedulerType] == false)\r
149         return;\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         memset(NSHeadMsg[schedulerType], 0, sizeof(NSTask));\r
161         NSHeadMsg[schedulerType]->taskType = taskType;\r
162         NSHeadMsg[schedulerType]->taskData = data;\r
163         NSHeadMsg[schedulerType]->nextTask = NULL;\r
164         NSTailMsg[schedulerType] = NSHeadMsg[schedulerType];\r
165     }\r
166     else\r
167     {\r
168         NSTask* newNode = (NSTask*) OICMalloc(sizeof(NSTask));\r
169         memset(newNode, 0, sizeof(NSTask));\r
170         newNode->taskType = taskType;\r
171         newNode->taskData = data;\r
172         newNode->nextTask = NULL;\r
173 \r
174         NSTailMsg[schedulerType]->nextTask = newNode;\r
175         NSTailMsg[schedulerType] = newNode;\r
176     }\r
177 \r
178     sem_post(&(NSSemaphore[schedulerType]));\r
179     NS_LOG(DEBUG, "NSPushQueue - OUT");\r
180     pthread_mutex_unlock(&NSMutex[schedulerType]);\r
181 }\r
182 \r
183 void NSFreeData(NSSchedulerType type, NSTask * task)\r
184 {\r
185     NS_LOG(DEBUG, "NSFreeData - IN");\r
186 \r
187     if (type == INTERFACE_SCHEDULER)\r
188     {\r
189         switch (task->taskType)\r
190         {\r
191             case TASK_CB_SUBSCRIPTION:\r
192                 NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : Free");\r
193                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
194                 break;\r
195             case TASK_CB_SYNC:\r
196                 NS_LOG(DEBUG, "CASE TASK_CB_SYNC : Free");\r
197                 NSFreeSync((NSSyncInfo*) task->taskData);\r
198                 break;\r
199             default:\r
200                 NS_LOG(DEBUG, "No Task Type");\r
201                 break;\r
202         }\r
203     }\r
204     else if (type == DISCOVERY_SCHEDULER)\r
205     {\r
206         switch (task->taskType)\r
207         {\r
208             case TASK_START_PRESENCE:\r
209             case TASK_STOP_PRESENCE:\r
210             case TASK_REGISTER_RESOURCE:\r
211                 NS_LOG(DEBUG, "Not required Free");\r
212                 break;\r
213             default:\r
214                 NS_LOG(DEBUG, "No Task Type");\r
215                 break;\r
216         }\r
217     }\r
218     else if (type == SUBSCRIPTION_SCHEDULER)\r
219     {\r
220         switch (task->taskType)\r
221         {\r
222             case TASK_SEND_POLICY:\r
223             case TASK_RECV_SUBSCRIPTION:\r
224             case TASK_RECV_UNSUBSCRIPTION:\r
225             case TASK_SYNC_SUBSCRIPTION:\r
226                 NS_LOG(DEBUG, "NSFreeOCEntityHandlerRequest : Free ");\r
227                 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);\r
228                 break;\r
229             case TASK_SEND_ALLOW:\r
230             case TASK_SEND_DENY:\r
231                 NS_LOG(DEBUG, "NSFreeConsumer : Free ");\r
232                 NSFreeConsumer((NSConsumer *) task->taskData);\r
233                 break;\r
234             default:\r
235                 NS_LOG(DEBUG, "No Task Type");\r
236                 break;\r
237         }\r
238     }\r
239     else if (type == NOTIFICATION_SCHEDULER)\r
240     {\r
241         switch (task->taskType)\r
242         {\r
243             case TASK_SEND_NOTIFICATION:\r
244             {\r
245                 NS_LOG(DEBUG, "NSFreeMessage : Free ");\r
246                 NSFreeMessage((NSMessage *)task->taskData);\r
247                 break;\r
248             }\r
249             case TASK_SEND_READ:\r
250             case TASK_RECV_READ:\r
251                 NS_LOG(DEBUG, "NSFreeSync : Free ");\r
252                 NSFreeSync((NSSyncInfo*) task->taskData);\r
253                 break;\r
254 \r
255             default:\r
256                 NS_LOG(DEBUG, "No Task Type");\r
257                 break;\r
258         }\r
259     }\r
260 \r
261     NS_LOG(DEBUG, "NSFreeData - OUT");\r
262 }\r