1 //******************************************************************
\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\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
11 // http://www.apache.org/licenses/LICENSE-2.0
\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
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
21 #include "NSProviderScheduler.h"
\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
28 NSTask* NSHeadMsg[THREAD_COUNT];
\r
29 NSTask* NSTailMsg[THREAD_COUNT];
\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
37 bool NSInitScheduler()
\r
39 NS_LOG(DEBUG, "NSInitScheduler - IN");
\r
43 for (i = 0; i < THREAD_COUNT; i++)
\r
45 pthread_mutex_init(&NSMutex[i], NULL);
\r
46 NSIsRunning[i] = true;
\r
47 sem_init(&(NSSemaphore[i]), 0, 0);
\r
50 NS_LOG(DEBUG, "NSInitScheduler - OUT");
\r
55 bool NSStartScheduler()
\r
59 for (i = 0; i < THREAD_COUNT; i++)
\r
61 pthread_mutex_lock(&NSMutex[i]);
\r
65 case CALLBACK_RESPONSE_SCHEDULER:
\r
67 NS_LOG(DEBUG, "CASE RESPONSE_SCHEDULER :");
\r
68 pthread_create(&NSThread[i], NULL, NSCallbackResponseSchedule, NULL);
\r
72 case DISCOVERY_SCHEDULER:
\r
74 NS_LOG(DEBUG, "CASE DISCOVERY_SCHEDULER :");
\r
75 pthread_create(&NSThread[i], NULL, NSDiscoverySchedule, NULL);
\r
79 case SUBSCRIPTION_SCHEDULER:
\r
81 NS_LOG(DEBUG, "CASE SUBSCRIPTION_SCHEDULER :");
\r
82 pthread_create(&NSThread[i], NULL, NSSubScriptionSchedule, NULL);
\r
86 case NOTIFICATION_SCHEDULER:
\r
88 NS_LOG(DEBUG, "CASE NOTIFICATION_SCHEDULER :");
\r
89 pthread_create(&NSThread[i], NULL, NSNotificationSchedule, NULL);
\r
93 case TOPIC_SCHEDULER:
\r
95 NS_LOG(DEBUG, "CASE TOPIC_SCHEDULER :");
\r
96 pthread_create(&NSThread[i], NULL, NSTopicSchedule, NULL);
\r
104 NSHeadMsg[i] = NSTailMsg[i] = NULL;
\r
106 pthread_mutex_unlock(&NSMutex[i]);
\r
113 bool NSStopScheduler()
\r
115 NS_LOG(DEBUG, "NSStopScheduler - IN");
\r
118 for (i = THREAD_COUNT - 1; i >= 0; --i)
\r
122 NSIsRunning[i] = false;
\r
124 sem_post(&(NSSemaphore[i]));
\r
125 pthread_join(NSThread[i], (void **) &status);
\r
129 pthread_mutex_lock(&NSMutex[i]);
\r
131 while (NSHeadMsg[i] != NULL)
\r
133 NSTask* temp = NSHeadMsg[i];
\r
134 NSHeadMsg[i] = NSHeadMsg[i]->nextTask;
\r
135 NSFreeData(i, temp);
\r
139 NSTailMsg[i] = NSHeadMsg[i] = NULL;
\r
141 pthread_mutex_unlock(&NSMutex[i]);
\r
142 pthread_mutex_destroy(&NSMutex[i]);
\r
145 NS_LOG(DEBUG, "NSStopScheduler - OUT");
\r
150 void NSPushQueue(NSSchedulerType schedulerType, NSTaskType taskType, void* data)
\r
153 if(!NSIsRunning[schedulerType])
\r
158 pthread_mutex_lock(&NSMutex[schedulerType]);
\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
164 if (NSHeadMsg[schedulerType] == NULL)
\r
166 NSHeadMsg[schedulerType] = (NSTask*) OICMalloc(sizeof(NSTask));
\r
167 if(NSHeadMsg[schedulerType])
\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
177 NSTask* newNode = (NSTask*) OICMalloc(sizeof(NSTask));
\r
180 newNode->taskType = taskType;
\r
181 newNode->taskData = data;
\r
182 newNode->nextTask = NULL;
\r
184 NSTailMsg[schedulerType]->nextTask = newNode;
\r
185 NSTailMsg[schedulerType] = newNode;
\r
189 sem_post(&(NSSemaphore[schedulerType]));
\r
190 NS_LOG(DEBUG, "NSPushQueue - OUT");
\r
191 pthread_mutex_unlock(&NSMutex[schedulerType]);
\r
194 void NSFreeData(NSSchedulerType type, NSTask * task)
\r
196 NS_LOG(DEBUG, "NSFreeData - IN");
\r
198 if (type == CALLBACK_RESPONSE_SCHEDULER)
\r
200 switch (task->taskType)
\r
202 case TASK_CB_SUBSCRIPTION:
\r
203 NS_LOG(DEBUG, "CASE TASK_CB_SUBSCRIPTION : Free");
\r
204 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);
\r
207 NS_LOG(DEBUG, "CASE TASK_CB_SYNC : Free");
\r
208 NSFreeSync((NSSyncInfo*) task->taskData);
\r
211 NS_LOG(DEBUG, "No Task Type");
\r
215 else if (type == DISCOVERY_SCHEDULER)
\r
217 switch (task->taskType)
\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
225 NS_LOG(DEBUG, "No Task Type");
\r
229 else if (type == SUBSCRIPTION_SCHEDULER)
\r
231 switch (task->taskType)
\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
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
246 NS_LOG(DEBUG, "No Task Type");
\r
250 else if (type == NOTIFICATION_SCHEDULER)
\r
252 switch (task->taskType)
\r
254 case TASK_SEND_NOTIFICATION:
\r
256 NS_LOG(DEBUG, "NSFreeMessage : Free ");
\r
257 NSFreeMessage((NSMessage *)task->taskData);
\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
267 NS_LOG(DEBUG, "No Task Type");
\r
271 else if (type == TOPIC_SCHEDULER)
\r
273 switch (task->taskType)
\r
275 case TASK_SUBSCRIBE_TOPIC:
\r
276 case TASK_UNSUBSCRIBE_TOPIC:
\r
278 NSCacheTopicSubData * data = task->taskData;
\r
279 OICFree(data->topicName);
\r
283 case TASK_REGISTER_TOPIC:
\r
284 case TASK_UNREGISTER_TOPIC:
\r
286 OICFree(task->taskData);
\r
289 case TASK_SEND_TOPICS:
\r
290 case TASK_POST_TOPIC:
\r
292 NS_LOG(DEBUG, "TASK_POST_TOPIC : ");
\r
293 NSFreeOCEntityHandlerRequest((OCEntityHandlerRequest*) task->taskData);
\r
300 NS_LOG(DEBUG, "NSFreeData - OUT");
\r