Destroy mutex and mutex Attribute in ProviderMemoryCache.
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderInterface.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 "NSProviderInterface.h"\r
22 #include "NSProviderScheduler.h"\r
23 #include "NSProviderListener.h"\r
24 #include "NSProviderSubscription.h"\r
25 #include "NSProviderNotification.h"\r
26 #include "NSProviderCallbackResponse.h"\r
27 #include "NSStorageAdapter.h"\r
28 #include "NSProviderMemoryCache.h"\r
29 #include "oic_malloc.h"\r
30 #include "oic_string.h"\r
31 #include "cautilinterface.h"\r
32 #include "NSProviderSystem.h"\r
33 #include "oic_time.h"\r
34 \r
35 bool initProvider = false;\r
36 \r
37 pthread_mutex_t nsInitMutex;\r
38 \r
39 void initializeMutex()\r
40 {\r
41     static pthread_mutex_t initMutex = PTHREAD_MUTEX_INITIALIZER;\r
42     nsInitMutex = initMutex;\r
43 }\r
44 \r
45 NSResult NSStartProvider(NSAccessPolicy policy, NSSubscribeRequestCallback subscribeRequestCb,\r
46         NSProviderSyncInfoCallback syncCb)\r
47 {\r
48     NS_LOG(DEBUG, "NSStartProvider - IN");\r
49 \r
50     initializeMutex();\r
51 \r
52     pthread_mutex_lock(&nsInitMutex);\r
53 \r
54     if (!initProvider)\r
55     {\r
56         NS_LOG(DEBUG, "Init Provider");\r
57         initProvider = true;\r
58         NSInitProviderInfo();\r
59         NSSetSubscriptionAccessPolicy(policy);\r
60         NSRegisterSubscribeRequestCb(subscribeRequestCb);\r
61         NSRegisterSyncCb(syncCb);\r
62         CARegisterNetworkMonitorHandler((CAAdapterStateChangedCB)NSProviderAdapterStateListener,\r
63                 (CAConnectionStateChangedCB)NSProviderConnectionStateListener);\r
64 \r
65         NSSetList();\r
66         NSInitScheduler();\r
67         NSStartScheduler();\r
68 \r
69         NSPushQueue(DISCOVERY_SCHEDULER, TASK_START_PRESENCE, NULL);\r
70         NSPushQueue(DISCOVERY_SCHEDULER, TASK_REGISTER_RESOURCE, NULL);\r
71     }\r
72     else\r
73     {\r
74         NS_LOG(DEBUG, "Already started Notification Provider");\r
75     }\r
76     pthread_mutex_unlock(&nsInitMutex);\r
77 \r
78     NS_LOG(DEBUG, "NSStartProvider - OUT");\r
79     return NS_OK;\r
80 }\r
81 \r
82 void NSSetList()\r
83 {\r
84     NS_LOG(DEBUG, "NSSetList - IN");\r
85 \r
86     pthread_mutexattr_init(&NSCacheMutexAttr);\r
87     int pthreadResult = pthread_mutexattr_settype(&NSCacheMutexAttr, PTHREAD_MUTEX_RECURSIVE);\r
88     pthread_mutex_init(&NSCacheMutex, &NSCacheMutexAttr);\r
89 \r
90     NSInitSubscriptionList();\r
91     NSInitMessageList();\r
92     NS_LOG(DEBUG, "NSSetList - OUT");\r
93 }\r
94 \r
95 void NSDestroyList()\r
96 {\r
97     NSStorageDestroy(consumerSubList);\r
98     NSStorageDestroy(messageList);\r
99 \r
100     pthread_mutex_destroy(&NSCacheMutex);\r
101     pthread_mutexattr_destroy(&NSCacheMutexAttr);\r
102 }\r
103 \r
104 NSResult NSStopProvider()\r
105 {\r
106     NS_LOG(DEBUG, "NSStopProvider - IN");\r
107     pthread_mutex_lock(&nsInitMutex);\r
108 \r
109     if(initProvider)\r
110     {\r
111         NSDeinitProviderInfo();\r
112         NSUnRegisterResource();\r
113         NSRegisterSubscribeRequestCb((NSSubscribeRequestCallback)NULL);\r
114         NSRegisterSyncCb((NSProviderSyncInfoCallback)NULL);\r
115         NSStopScheduler();\r
116         NSDestroyList();\r
117 \r
118         initProvider = false;\r
119     }\r
120 \r
121     pthread_mutex_unlock(&nsInitMutex);\r
122     NS_LOG(DEBUG, "NSStopProvider - OUT");\r
123     return NS_OK;\r
124 }\r
125 \r
126 NSResult NSProviderEnableRemoteService(char *serverAddress)\r
127 {\r
128     NS_LOG(DEBUG, "NSProviderEnableRemoteService - IN");\r
129     pthread_mutex_lock(&nsInitMutex);\r
130  \r
131     if(!initProvider)\r
132     {\r
133         NS_LOG(DEBUG, "Provider service has not been started yet");\r
134         pthread_mutex_unlock(&nsInitMutex);\r
135         return NS_FAIL;\r
136     }\r
137 \r
138     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
139     NSPushQueue(DISCOVERY_SCHEDULER, TASK_PUBLISH_RESOURCE, serverAddress);\r
140 \r
141     pthread_mutex_unlock(&nsInitMutex);\r
142     NS_LOG(DEBUG, "NSProviderEnableRemoteService - OUT");\r
143     return NS_OK;\r
144 }\r
145 \r
146 NSResult NSProviderDisableRemoteService(char *serverAddress)\r
147 {\r
148     NS_LOG(DEBUG, "NSProviderDisableRemoteService - IN");\r
149     pthread_mutex_lock(&nsInitMutex);\r
150 \r
151     if(!initProvider)\r
152     {\r
153         NS_LOG(DEBUG, "Provider service has not been started yet");\r
154         return NS_FAIL;\r
155     }\r
156     NS_LOG_V(DEBUG, "Remote server address: %s", serverAddress);\r
157 \r
158     pthread_mutex_unlock(&nsInitMutex);\r
159     NS_LOG(DEBUG, "NSProviderDisableRemoteService - OUT");\r
160     return NS_OK;\r
161 }\r
162 \r
163 NSResult NSSendMessage(NSMessage *msg)\r
164 {\r
165     NS_LOG(DEBUG, "NSSendNotification - IN");\r
166 \r
167     pthread_mutex_lock(&nsInitMutex);\r
168 \r
169     if(msg == NULL)\r
170     {\r
171         NS_LOG(ERROR, "Msg is NULL");\r
172         pthread_mutex_unlock(&nsInitMutex);\r
173         return NS_ERROR;\r
174     }\r
175 \r
176     NSMessage * newMsg = NSDuplicateMessage(msg);\r
177     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_NOTIFICATION, newMsg);\r
178 \r
179     pthread_mutex_unlock(&nsInitMutex);\r
180 \r
181     NS_LOG(DEBUG, "NSSendNotification - OUT");\r
182     return NS_OK;\r
183 }\r
184 \r
185 NSResult NSProviderSendSyncInfo(uint64_t messageId, NSSyncType type)\r
186 {\r
187     NS_LOG(DEBUG, "NSProviderReadCheck - IN");\r
188     pthread_mutex_lock(&nsInitMutex);\r
189 \r
190     NSSyncInfo * syncInfo = (NSSyncInfo *)OICMalloc(sizeof(NSSyncInfo));\r
191     OICStrcpy(syncInfo->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
192     syncInfo->messageId = messageId;\r
193     syncInfo->state = type;\r
194     NSPushQueue(NOTIFICATION_SCHEDULER, TASK_SEND_READ, syncInfo);\r
195 \r
196     pthread_mutex_unlock(&nsInitMutex);\r
197     NS_LOG(DEBUG, "NSProviderReadCheck - OUT");\r
198     return NS_OK;\r
199 }\r
200 \r
201 NSResult NSAcceptSubscription(NSConsumer *consumer, bool accepted)\r
202 {\r
203     NS_LOG(DEBUG, "NSAccept - IN");\r
204 \r
205     pthread_mutex_lock(&nsInitMutex);\r
206 \r
207     NSConsumer * newConsumer = NSDuplicateConsumer(consumer);\r
208 \r
209     if(accepted)\r
210     {\r
211         NS_LOG(DEBUG, "accepted is true - ALLOW");\r
212         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_ALLOW, newConsumer);\r
213     }\r
214     else\r
215     {\r
216         NS_LOG(DEBUG, "accepted is false - DENY");\r
217         NSPushQueue(SUBSCRIPTION_SCHEDULER, TASK_SEND_DENY, newConsumer);\r
218     }\r
219 \r
220     pthread_mutex_unlock(&nsInitMutex);\r
221     NS_LOG(DEBUG, "NSAccept - OUT");\r
222     return NS_OK;\r
223 }\r
224 \r
225 NSMessage * NSCreateMessage()\r
226 {\r
227     NS_LOG(DEBUG, "NSCreateMessage - IN");\r
228     pthread_mutex_lock(&nsInitMutex);\r
229 \r
230     NSMessage * msg = NSInitializeMessage();\r
231     OICStrcpy(msg->providerId, UUID_STRING_SIZE, NSGetProviderInfo()->providerId);\r
232 \r
233     pthread_mutex_unlock(&nsInitMutex);\r
234     NS_LOG(DEBUG, "NSCreateMessage - OUT");\r
235     return msg;\r
236 }\r