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