IoT-243 Connectivity Abstraction single-threaded module missing definition for CASend...
[platform/upstream/iotivity.git] / resource / csdk / connectivity / common / src / uqueue.c
1 /******************************************************************
2  *
3  * Copyright 2014 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************/
20 #include "uqueue.h"
21
22 #include <stddef.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include "logger.h"
26 #include "oic_malloc.h"
27
28 /**
29  * @def NO_MESSAGES
30  * @brief Number of messages in the queue
31  */
32 #define NO_MESSAGES 0
33
34 /**
35  * @def TAG
36  * @brief Logging tag for module name
37  */
38 #define TAG "UQUEUE"
39
40 u_queue_t *u_queue_create()
41 {
42     u_queue_t *queuePtr = (u_queue_t *) OICMalloc(sizeof(u_queue_t));
43     if (NULL == queuePtr)
44     {
45         OIC_LOG(DEBUG, TAG, "QueueCreate FAIL");
46         return NULL;
47     }
48
49     queuePtr->count = NO_MESSAGES;
50     queuePtr->element = NULL;
51
52     return queuePtr;
53 }
54
55 CAResult_t u_queue_add_element(u_queue_t *queue, u_queue_message_t *message)
56 {
57     u_queue_element *element = NULL;
58     u_queue_element *ptr = NULL;
59
60     if (NULL == queue)
61     {
62         OIC_LOG(DEBUG, TAG, "QueueAddElement FAIL, Invalid Queue");
63         return CA_STATUS_FAILED;
64     }
65
66     if (NULL == message)
67     {
68         OIC_LOG(DEBUG, TAG, "QueueAddElement : FAIL, NULL Message");
69         return CA_STATUS_FAILED;
70     }
71
72     element = (u_queue_element *) OICMalloc(sizeof(u_queue_element));
73     if (NULL == element)
74     {
75         OIC_LOG(DEBUG, TAG, "QueueAddElement FAIL, memory allocation failed");
76         return CA_MEMORY_ALLOC_FAILED;
77     }
78
79     element->message = message;
80     element->next = NULL;
81
82     ptr = queue->element;
83
84     if (NULL != ptr)
85     {
86         while (NULL != ptr->next)
87         {
88             ptr = ptr->next;
89         }
90
91         ptr->next = element;
92         queue->count++;
93
94         OIC_LOG_V(DEBUG, TAG, "Queue Count : %d", queue->count);
95     }
96     else
97     {
98         if (NO_MESSAGES != queue->count)
99         {
100             OIC_LOG(DEBUG, TAG, "QueueAddElement : FAIL, count is not zero");
101
102             /* error in queue, free the allocated memory*/
103             OICFree(element);
104             return CA_STATUS_FAILED;
105         }
106
107         queue->element = element;
108         queue->count++;
109         OIC_LOG_V(DEBUG, TAG, "Queue Count : %d", queue->count);
110
111         return CA_STATUS_OK;
112     }
113
114     return CA_STATUS_OK;
115 }
116
117 u_queue_message_t *u_queue_get_element(u_queue_t *queue)
118 {
119     u_queue_element *next = NULL;
120     u_queue_element *element = NULL;
121     u_queue_message_t *message = NULL;
122
123     if (NULL == queue)
124     {
125         OIC_LOG(DEBUG, TAG, "QueueAddElement FAIL, Invalid Queue");
126         return NULL;
127     }
128
129     element = queue->element;
130
131     if (NULL == element)
132     {
133         OIC_LOG(DEBUG, TAG, "QueueGetElement : empty, no messages");
134         return NULL;
135     }
136
137     next = element->next;
138     queue->element = next;
139     queue->count--;
140
141     message = element->message;
142     OICFree(element);
143     return message;
144 }
145
146 CAResult_t u_queue_remove_element(u_queue_t *queue)
147 {
148     u_queue_element *next = NULL;
149     u_queue_element *remove = NULL;
150
151     if (NULL == queue)
152     {
153         OIC_LOG(DEBUG, TAG, "QueueRemoveElement FAIL, Invalid Queue");
154         return CA_STATUS_FAILED;
155     }
156
157     remove = queue->element;
158
159     if (NULL == remove)
160     {
161         OIC_LOG(DEBUG, TAG, "QueueRemoveElement : no messages");
162         return CA_STATUS_OK;
163     }
164
165     next = remove->next;
166
167     OICFree(remove->message);
168     OICFree(remove);
169
170     queue->element = next;
171     queue->count--;
172
173     return CA_STATUS_OK;
174 }
175
176 uint32_t u_queue_get_size(u_queue_t *queue)
177 {
178     if (NULL == queue)
179     {
180         OIC_LOG(DEBUG, TAG, "QueueGetSize FAIL, Invalid Queue");
181         return NO_MESSAGES;
182     }
183
184     return queue->count;
185 }
186
187 CAResult_t u_queue_reset(u_queue_t *queue)
188 {
189     CAResult_t error = CA_STATUS_FAILED;
190
191     if (NULL == queue)
192     {
193         OIC_LOG(DEBUG, TAG, "QueueReset FAIL, Invalid Queue");
194         return CA_STATUS_FAILED;
195     }
196
197     if (NO_MESSAGES == queue->count)
198     {
199         OIC_LOG(DEBUG, TAG, "QueueReset, no elements in the queue");
200         return CA_STATUS_OK;
201     }
202
203     while (NULL != queue->element)
204     {
205         error = u_queue_remove_element(queue);
206         if (error == CA_STATUS_FAILED)
207             break;
208     }
209
210     if (NO_MESSAGES != queue->count)
211     {
212         OIC_LOG(DEBUG, TAG, "QueueReset : FAIL, count is non zero");
213         return CA_STATUS_FAILED;
214     }
215
216     return CA_STATUS_OK;
217
218 }
219
220 CAResult_t u_queue_delete(u_queue_t *queue)
221 {
222     CAResult_t error = CA_STATUS_FAILED;
223
224     if (NULL == queue)
225     {
226         OIC_LOG(DEBUG, TAG, "QueueDelete FAIL, Invalid Queue");
227         return CA_STATUS_FAILED;
228     }
229
230     error = u_queue_reset(queue);
231     if (error != CA_STATUS_OK)
232     {
233         OIC_LOG(DEBUG, TAG, "QueueDelete : FAIL, error in QueueReset");
234         return error;
235     }
236
237     OICFree(queue);
238     return (CA_STATUS_OK);
239 }
240
241 u_queue_message_t *u_queue_get_head(u_queue_t *queue)
242 {
243     if (NULL == queue)
244     {
245         OIC_LOG(DEBUG, TAG, "QueueGetHead FAIL, Invalid Queue");
246         return NULL;
247     }
248
249     if (NULL == queue->element)
250     {
251         OIC_LOG(DEBUG, TAG, "QueueGetHead : no messages in queue");
252         return NULL;
253     }
254     return queue->element->message;
255 }