1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <errno.h>
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <string.h>
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/types.h>
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/poll.h>
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <unistd.h>
231d0e99f00b2089482e5f7c91ce0b0866f465a4d6Mathias Agopian#include <utils/Errors.h>
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "MessageQueue"
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/Log.h>
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "MessageQueue.h"
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace TIUTILS {
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor for the message queue class
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevMessageQueue::MessageQueue()
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int fds[2] = {-1,-1};
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    android::status_t stat;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stat = pipe(fds);
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > stat )
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEB("Error while openning pipe: %s", strerror(stat) );
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        this->fd_read = 0;
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        this->fd_write = 0;
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mHasMsg = false;
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        this->fd_read = fds[0];
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        this->fd_write = fds[1];
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mHasMsg = false;
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor for the semaphore class
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevMessageQueue::~MessageQueue()
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
7718d4cb78c873c0ac1ab145f9b70d8f3d0e715185Iliyan Malchev    if(this->fd_read >= 0)
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(this->fd_read);
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
8218d4cb78c873c0ac1ab145f9b70d8f3d0e715185Iliyan Malchev    if(this->fd_write >= 0)
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(this->fd_write);
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Get a message from the queue
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param msg Message structure to hold the message to be retrieved
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::NO_ERROR On success
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::BAD_VALUE if the message pointer is NULL
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::NO_INIT If the file read descriptor is not set
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::UNKNOWN_ERROR if the read operation fromthe file read descriptor fails
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevandroid::status_t MessageQueue::get(Message* msg)
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!msg)
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("msg is NULL");
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::BAD_VALUE;
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!this->fd_read)
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("read descriptor not initialized for message queue");
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::NO_INIT;
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* p = (char*) msg;
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t read_bytes = 0;
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    while( read_bytes  < sizeof(*msg) )
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int err = read(this->fd_read, p, sizeof(*msg) - read_bytes);
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( err < 0 )
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            MSGQ_LOGEB("read() error: %s", strerror(errno));
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return android::UNKNOWN_ERROR;
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            read_bytes += err;
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    MSGQ_LOGDB("MQ.get(%d,%p,%p,%p,%p)", msg->command, msg->arg1,msg->arg2,msg->arg3,msg->arg4);
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mHasMsg = false;
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Get the input file descriptor of the message queue
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return file read descriptor
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint MessageQueue::getInFd()
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return this->fd_read;
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor for the message queue class
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param fd file read descriptor
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid MessageQueue::setInFd(int fd)
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( -1 != this->fd_read )
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(this->fd_read);
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    this->fd_read = fd;
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Queue a message
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param msg Message structure to hold the message to be retrieved
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::NO_ERROR On success
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::BAD_VALUE if the message pointer is NULL
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::NO_INIT If the file write descriptor is not set
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::UNKNOWN_ERROR if the write operation fromthe file write descriptor fails
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevandroid::status_t MessageQueue::put(Message* msg)
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* p = (char*) msg;
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size_t bytes = 0;
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!msg)
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("msg is NULL");
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::BAD_VALUE;
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!this->fd_write)
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("write descriptor not initialized for message queue");
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::NO_INIT;
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    MSGQ_LOGDB("MQ.put(%d,%p,%p,%p,%p)", msg->command, msg->arg1,msg->arg2,msg->arg3,msg->arg4);
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    while( bytes  < sizeof(msg) )
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int err = write(this->fd_write, p, sizeof(*msg) - bytes);
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( err < 0 )
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            MSGQ_LOGEB("write() error: %s", strerror(errno));
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return android::UNKNOWN_ERROR;
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes += err;
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    MSGQ_LOGDA("MessageQueue::put EXIT");
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns if the message queue is empty or not
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If the queue is empty
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return false If the queue has at least one message
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool MessageQueue::isEmpty()
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct pollfd pfd;
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pfd.fd = this->fd_read;
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pfd.events = POLLIN;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pfd.revents = 0;
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!this->fd_read)
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("read descriptor not initialized for message queue");
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::NO_INIT;
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( -1 == poll(&pfd,1,0) )
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEB("poll() error: %s", strerror(errno));
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return false;
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(pfd.revents & POLLIN)
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mHasMsg = true;
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mHasMsg = false;
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return !mHasMsg;
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
279f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Ramanvoid MessageQueue::clear()
280f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman{
281f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman    if(!this->fd_read)
282f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        {
283f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        MSGQ_LOGEA("read descriptor not initialized for message queue");
284f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        LOG_FUNCTION_NAME_EXIT;
285f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        return;
286f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        }
287f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman
288f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman    Message msg;
289f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman    while(!isEmpty())
290f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        {
291f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        get(&msg);
292f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman        }
293f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman
294f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman}
295f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman
296f9df3ee5cfb3c3177bcc630abf6d756e8a60254cSundar Raman
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Force whether the message queue has message or not
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param hasMsg Whether the queue has a message or not
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid MessageQueue::setMsg(bool hasMsg)
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mHasMsg = hasMsg;
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @briefWait for message in maximum three different queues with a timeout
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param queue1 First queue. At least this should be set to a valid queue pointer
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param queue2 Second queue. Optional.
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param queue3 Third queue. Optional.
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param timeout The timeout value (in micro secs) to wait for a message in any of the queues
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::NO_ERROR On success
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::BAD_VALUE If queue1 is NULL
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return android::NO_INIT If the file read descriptor of any of the provided queues is not set
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevandroid::status_t MessageQueue::waitForMsg(MessageQueue *queue1, MessageQueue *queue2, MessageQueue *queue3, int timeout)
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int n =1;
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    struct pollfd pfd[3];
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!queue1)
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("queue1 pointer is NULL");
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::BAD_VALUE;
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pfd[0].fd = queue1->getInFd();
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!pfd[0].fd)
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEA("read descriptor not initialized for message queue1");
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return android::NO_INIT;
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pfd[0].events = POLLIN;
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pfd[0].revents = 0;
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(queue2)
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGDA("queue2 not-null");
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pfd[1].fd = queue2->getInFd();
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!pfd[1].fd)
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            MSGQ_LOGEA("read descriptor not initialized for message queue2");
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return android::NO_INIT;
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pfd[1].events = POLLIN;
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pfd[1].revents = 0;
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        n++;
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(queue3)
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGDA("queue3 not-null");
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pfd[2].fd = queue3->getInFd();
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!pfd[2].fd)
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            MSGQ_LOGEA("read descriptor not initialized for message queue3");
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return android::NO_INIT;
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pfd[2].events = POLLIN;
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pfd[2].revents = 0;
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        n++;
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int ret = poll(pfd, n, timeout);
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret==0)
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret<android::NO_ERROR)
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        MSGQ_LOGEB("Message queue returned error %d", ret);
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (pfd[0].revents & POLLIN)
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        queue1->setMsg(true);
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(queue2)
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (pfd[1].revents & POLLIN)
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            queue2->setMsg(true);
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(queue3)
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (pfd[2].revents & POLLIN)
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            queue3->setMsg(true);
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
416