MessageQueue.cpp revision 18d4cb78c873c0ac1ab145f9b70d8f3d0e715185
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> 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <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 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Force whether the message queue has message or not 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param hasMsg Whether the queue has a message or not 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid MessageQueue::setMsg(bool hasMsg) 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mHasMsg = hasMsg; 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @briefWait for message in maximum three different queues with a timeout 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param queue1 First queue. At least this should be set to a valid queue pointer 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param queue2 Second queue. Optional. 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param queue3 Third queue. Optional. 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param timeout The timeout value (in micro secs) to wait for a message in any of the queues 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return android::NO_ERROR On success 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return android::BAD_VALUE If queue1 is NULL 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return android::NO_INIT If the file read descriptor of any of the provided queues is not set 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevandroid::status_t MessageQueue::waitForMsg(MessageQueue *queue1, MessageQueue *queue2, MessageQueue *queue3, int timeout) 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int n =1; 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev struct pollfd pfd[3]; 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!queue1) 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGEA("queue1 pointer is NULL"); 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return android::BAD_VALUE; 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[0].fd = queue1->getInFd(); 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!pfd[0].fd) 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGEA("read descriptor not initialized for message queue1"); 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return android::NO_INIT; 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[0].events = POLLIN; 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[0].revents = 0; 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(queue2) 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGDA("queue2 not-null"); 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[1].fd = queue2->getInFd(); 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!pfd[1].fd) 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGEA("read descriptor not initialized for message queue2"); 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return android::NO_INIT; 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[1].events = POLLIN; 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[1].revents = 0; 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev n++; 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(queue3) 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGDA("queue3 not-null"); 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[2].fd = queue3->getInFd(); 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!pfd[2].fd) 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGEA("read descriptor not initialized for message queue3"); 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return android::NO_INIT; 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[2].events = POLLIN; 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pfd[2].revents = 0; 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev n++; 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int ret = poll(pfd, n, timeout); 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(ret==0) 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(ret<android::NO_ERROR) 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MSGQ_LOGEB("Message queue returned error %d", ret); 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pfd[0].revents & POLLIN) 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev queue1->setMsg(true); 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(queue2) 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pfd[1].revents & POLLIN) 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev queue2->setMsg(true); 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(queue3) 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pfd[2].revents & POLLIN) 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev queue3->setMsg(true); 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 398