sensor-framework : Initial commit
[platform/core/system/sensord.git] / src / shared / csensor_event_queue.cpp
1 /*
2  * libsensord-share
3  *
4  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <csensor_event_queue.h>
21 #include "common.h"
22
23 csensor_event_queue::csensor_event_queue()
24 {
25 }
26
27 void csensor_event_queue::push(sensor_event_t const &event)
28 {
29         sensor_event_t *new_event = new sensor_event_t;
30         *new_event = event;
31         push_internal(new_event);
32 }
33
34 void csensor_event_queue::push(sensorhub_event_t const &event)
35 {
36         sensorhub_event_t *new_event = new sensorhub_event_t;
37         *new_event = event;
38         push_internal(new_event);
39 }
40
41 void csensor_event_queue::push_internal(void *event)
42 {
43         lock l(m_mutex);
44         bool wake = m_queue.empty();
45
46         if (m_queue.size() >= QUEUE_FULL_SIZE) {
47                 ERR("Queue is full");
48         } else
49                 m_queue.push(event);
50
51         if (wake)
52                 m_cond_var.notify_one();
53 }
54
55 void *csensor_event_queue::pop(void)
56 {
57         ulock u(m_mutex);
58
59         while (m_queue.empty())
60                 m_cond_var.wait(u);
61
62         void *event = m_queue.front();
63         m_queue.pop();
64         return event;
65 }
66