added cacheadapter interface and memorycache of notification.
[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     OIC_LOG(INFO, SCHEDULER_TAG, "NSInitScheduler()");\r
42 \r
43     int i = 0;\r
44     //  NsQsStopScheduler(ALL_SCHEDULER);\r
45 \r
46     for (i = 0; i < THREAD_COUNT; i++)\r
47     {\r
48         pthread_mutex_init(&NSMutex[i], NULL);\r
49         NSIsRunning[i] = true;\r
50         sem_init(&(NSSemaphore[i]), 0, 0);\r
51     }\r
52 \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                 pthread_create(&NSThread[i], NULL, NSResponseSchedule, NULL);\r
69             }\r
70                 break;\r
71 \r
72             case DISCOVERY_SCHEDULER:\r
73             {\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                 pthread_create(&NSThread[i], NULL, NSSubScriptionSchedule, NULL);\r
81             }\r
82                 break;\r
83 \r
84             case NOTIFICATION_SCHEDULER:\r
85             {\r
86                 pthread_create(&NSThread[i], NULL, NSNotificationSchedule, NULL);\r
87             }\r
88                 break;\r
89 \r
90             default:\r
91                 break;\r
92 \r
93         }\r
94 \r
95         NSHeadMsg[i] = NSTailMsg[i] = NULL;\r
96 \r
97         pthread_mutex_unlock(&NSMutex[i]);\r
98 \r
99     }\r
100 \r
101     return true;\r
102 }\r
103 \r
104 bool NSStopScheduler()\r
105 {\r
106     int i = 0;\r
107 \r
108     for (i = THREAD_COUNT - 1; i >= 0; --i)\r
109     {\r
110 \r
111         NSIsRunning[i] = false;\r
112 \r
113         pthread_join(NSThread[i], (void *) NULL);\r
114         NSThread[i] = 0;\r
115 \r
116         pthread_mutex_lock(&NSMutex[i]);\r
117 \r
118         while (NSHeadMsg[i]->nextTask != NULL)\r
119         {\r
120             NSTask* temp = NSHeadMsg[i];\r
121             NSHeadMsg[i] = NSHeadMsg[i]->nextTask;\r
122             OICFree(temp);\r
123         }\r
124 \r
125         OICFree(NSHeadMsg[i]);\r
126 \r
127         pthread_mutex_unlock(&NSMutex[i]);\r
128     }\r
129 \r
130     return true;\r
131 }\r
132 \r
133 void NSPushQueue(NSSchedulerType schedulerType, NSTaskType taskType, void* data)\r
134 {\r
135     pthread_mutex_lock(&NSMutex[schedulerType]);\r
136     // mutext Lock\r
137     if (NSHeadMsg[schedulerType] == NULL)\r
138     {\r
139         printf("first schedule");\r
140         NSHeadMsg[schedulerType] = (NSTask*) malloc(sizeof(NSTask));\r
141         memset(NSHeadMsg[schedulerType], 0, sizeof(NSTask));\r
142         NSHeadMsg[schedulerType]->taskType = taskType;\r
143         NSHeadMsg[schedulerType]->taskData = data;\r
144         NSHeadMsg[schedulerType]->nextTask = NULL;\r
145         NSTailMsg[schedulerType] = NSHeadMsg[schedulerType];\r
146     }\r
147     else\r
148     {\r
149         printf("after first schedule");\r
150         NSTask* newNode = (NSTask*) malloc(sizeof(NSTask));\r
151         memset(newNode, 0, sizeof(NSTask));\r
152         newNode->taskType = taskType;\r
153         newNode->taskData = data;\r
154         newNode->nextTask = NULL;\r
155 \r
156         NSTailMsg[schedulerType]->nextTask = newNode;\r
157         NSTailMsg[schedulerType] = newNode;\r
158     }\r
159 \r
160     sem_post(&(NSSemaphore[schedulerType]));\r
161     pthread_mutex_unlock(&NSMutex[schedulerType]);\r
162 \r
163     // mutext UnLock\r
164 }\r
165 \r