1e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 2e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * 3e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * Redistribution and use in source and binary forms, with or without 4e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * modification, are permitted provided that the following conditions are 5e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * met: 6e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * * Redistributions of source code must retain the above copyright 7e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * notice, this list of conditions and the following disclaimer. 8e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * * Redistributions in binary form must reproduce the above 9e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * copyright notice, this list of conditions and the following 10e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * disclaimer in the documentation and/or other materials provided 11e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * with the distribution. 12e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * * Neither the name of The Linux Foundation, nor the names of its 13e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * contributors may be used to endorse or promote products derived 14e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * from this software without specific prior written permission. 15e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * 16e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti */ 28e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 29e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "msg_q.h" 30e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 31e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#define LOG_TAG "LocSvc_utils_q" 32e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "log_util.h" 33e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "platform_lib_includes.h" 34e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "linked_list.h" 35e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <stdio.h> 36e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <stdlib.h> 37e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <pthread.h> 38e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 39e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletitypedef struct msg_q { 40e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti void* msg_list; /* Linked list to store information */ 41e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_cond_t list_cond; /* Condition variable for waiting on msg queue */ 42e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_t list_mutex; /* Mutex for exclusive access to message queue */ 43e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti int unblocked; /* Has this message queue been unblocked? */ 44e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} msg_q; 45e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 46e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 47e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION convert_linked_list_err_type 48e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 49e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION 50e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti Converts from one set of enum values to another. 51e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 52e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti linked_list_val: Value to convert to msg_q_enum_type 53e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 54e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES 55e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti N/A 56e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 57e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE 58e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti Corresponding linked_list_enum_type in msg_q_enum_type 59e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 60e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS 61e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti N/A 62e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 63e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/ 64e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic msq_q_err_type convert_linked_list_err_type(linked_list_err_type linked_list_val) 65e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 66e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti switch( linked_list_val ) 67e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 68e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti case eLINKED_LIST_SUCCESS: 69e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_SUCCESS; 70e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti case eLINKED_LIST_INVALID_PARAMETER: 71e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_PARAMETER; 72e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti case eLINKED_LIST_INVALID_HANDLE: 73e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_HANDLE; 74e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti case eLINKED_LIST_UNAVAILABLE_RESOURCE: 75e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_UNAVAILABLE_RESOURCE; 76e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti case eLINKED_LIST_INSUFFICIENT_BUFFER: 77e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INSUFFICIENT_BUFFER; 78e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 79e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti case eLINKED_LIST_FAILURE_GENERAL: 80e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti default: 81e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_FAILURE_GENERAL; 82e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 83e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 84e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 85e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/* ----------------------- END INTERNAL FUNCTIONS ---------------------------------------- */ 86e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 87e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 88e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 89e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_init 90e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 91e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 92e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletimsq_q_err_type msg_q_init(void** msg_q_data) 93e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 94e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( msg_q_data == NULL ) 95e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 96e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); 97e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_PARAMETER; 98e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 99e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 100e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msg_q* tmp_msg_q; 101e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti tmp_msg_q = (msg_q*)calloc(1, sizeof(msg_q)); 102e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( tmp_msg_q == NULL ) 103e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 104e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Unable to allocate space for message queue!\n", __FUNCTION__); 105e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_FAILURE_GENERAL; 106e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 107e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 108e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( linked_list_init(&tmp_msg_q->msg_list) != 0 ) 109e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 110e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Unable to initialize storage list!\n", __FUNCTION__); 111e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti free(tmp_msg_q); 112e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_FAILURE_GENERAL; 113e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 114e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 115e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( pthread_mutex_init(&tmp_msg_q->list_mutex, NULL) != 0 ) 116e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 117e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Unable to initialize list mutex!\n", __FUNCTION__); 118e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti linked_list_destroy(&tmp_msg_q->msg_list); 119e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti free(tmp_msg_q); 120e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_FAILURE_GENERAL; 121e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 122e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 123e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( pthread_cond_init(&tmp_msg_q->list_cond, NULL) != 0 ) 124e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 125e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Unable to initialize msg q cond var!\n", __FUNCTION__); 126e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti linked_list_destroy(&tmp_msg_q->msg_list); 127e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_destroy(&tmp_msg_q->list_mutex); 128e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti free(tmp_msg_q); 129e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_FAILURE_GENERAL; 130e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 131e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 132e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti tmp_msg_q->unblocked = 0; 133e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 134e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *msg_q_data = tmp_msg_q; 135e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 136e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_SUCCESS; 137e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 138e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 139e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 140e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 141e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_init2 142e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 143e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 144e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleticonst void* msg_q_init2() 145e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 146e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti void* q = NULL; 147e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if (eMSG_Q_SUCCESS != msg_q_init(&q)) { 148e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti q = NULL; 149e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 150e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return q; 151e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 152e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 153e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 154e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 155e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_destroy 156e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 157e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 158e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletimsq_q_err_type msg_q_destroy(void** msg_q_data) 159e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 160e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( msg_q_data == NULL ) 161e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 162e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); 163e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_HANDLE; 164e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 165e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 166e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msg_q* p_msg_q = (msg_q*)*msg_q_data; 167e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 168e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti linked_list_destroy(&p_msg_q->msg_list); 169e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_destroy(&p_msg_q->list_mutex); 170e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_cond_destroy(&p_msg_q->list_cond); 171e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 172e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti p_msg_q->unblocked = 0; 173e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 174e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti free(*msg_q_data); 175e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *msg_q_data = NULL; 176e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 177e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_SUCCESS; 178e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 179e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 180e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 181e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 182e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_snd 183e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 184e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 185e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletimsq_q_err_type msg_q_snd(void* msg_q_data, void* msg_obj, void (*dealloc)(void*)) 186e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 187e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msq_q_err_type rv; 188e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( msg_q_data == NULL ) 189e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 190e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); 191e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_HANDLE; 192e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 193e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( msg_obj == NULL ) 194e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 195e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_obj parameter!\n", __FUNCTION__); 196e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_PARAMETER; 197e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 198e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 199e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msg_q* p_msg_q = (msg_q*)msg_q_data; 200e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 201e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_lock(&p_msg_q->list_mutex); 202e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGV("%s: Sending message with handle = 0x%08X\n", __FUNCTION__, msg_obj); 203e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 204e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( p_msg_q->unblocked ) 205e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 206e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__); 207e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 208e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_UNAVAILABLE_RESOURCE; 209e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 210e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 211e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti rv = convert_linked_list_err_type(linked_list_add(p_msg_q->msg_list, msg_obj, dealloc)); 212e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 213e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti /* Show data is in the message queue. */ 214e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_cond_signal(&p_msg_q->list_cond); 215e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 216e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 217e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 218e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGV("%s: Finished Sending message with handle = 0x%08X\n", __FUNCTION__, msg_obj); 219e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 220e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return rv; 221e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 222e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 223e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 224e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 225e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_rcv 226e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 227e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 228e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletimsq_q_err_type msg_q_rcv(void* msg_q_data, void** msg_obj) 229e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 230e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msq_q_err_type rv; 231e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( msg_q_data == NULL ) 232e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 233e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); 234e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_HANDLE; 235e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 236e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 237e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( msg_obj == NULL ) 238e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 239e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_obj parameter!\n", __FUNCTION__); 240e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_PARAMETER; 241e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 242e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 243e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msg_q* p_msg_q = (msg_q*)msg_q_data; 244e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 245e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGV("%s: Waiting on message\n", __FUNCTION__); 246e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 247e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_lock(&p_msg_q->list_mutex); 248e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 249e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( p_msg_q->unblocked ) 250e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 251e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__); 252e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 253e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_UNAVAILABLE_RESOURCE; 254e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 255e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 256e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti /* Wait for data in the message queue */ 257e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti while( linked_list_empty(p_msg_q->msg_list) && !p_msg_q->unblocked ) 258e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 259e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_cond_wait(&p_msg_q->list_cond, &p_msg_q->list_mutex); 260e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 261e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 262e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti rv = convert_linked_list_err_type(linked_list_remove(p_msg_q->msg_list, msg_obj)); 263e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 264e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 265e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 266e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGV("%s: Received message 0x%08X rv = %d\n", __FUNCTION__, *msg_obj, rv); 267e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 268e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return rv; 269e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 270e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 271e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 272e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 273e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_flush 274e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 275e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 276e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletimsq_q_err_type msg_q_flush(void* msg_q_data) 277e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 278e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msq_q_err_type rv; 279e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if ( msg_q_data == NULL ) 280e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 281e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); 282e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_HANDLE; 283e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 284e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 285e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msg_q* p_msg_q = (msg_q*)msg_q_data; 286e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 287e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGD("%s: Flushing Message Queue\n", __FUNCTION__); 288e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 289e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_lock(&p_msg_q->list_mutex); 290e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 291e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti /* Remove all elements from the list */ 292e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti rv = convert_linked_list_err_type(linked_list_flush(p_msg_q->msg_list)); 293e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 294e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 295e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 296e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGD("%s: Message Queue flushed\n", __FUNCTION__); 297e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 298e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return rv; 299e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 300e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 301e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*=========================================================================== 302e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 303e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti FUNCTION: msg_q_unblock 304e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 305e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti ===========================================================================*/ 306e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletimsq_q_err_type msg_q_unblock(void* msg_q_data) 307e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{ 308e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if ( msg_q_data == NULL ) 309e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 310e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__); 311e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_INVALID_HANDLE; 312e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 313e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 314e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti msg_q* p_msg_q = (msg_q*)msg_q_data; 315e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_lock(&p_msg_q->list_mutex); 316e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 317e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti if( p_msg_q->unblocked ) 318e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti { 319e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__); 320e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 321e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_UNAVAILABLE_RESOURCE; 322e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti } 323e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 324e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGD("%s: Unblocking Message Queue\n", __FUNCTION__); 325e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti /* Unblocking message queue */ 326e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti p_msg_q->unblocked = 1; 327e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 328e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti /* Allow all the waiters to wake up */ 329e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_cond_broadcast(&p_msg_q->list_cond); 330e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 331e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti pthread_mutex_unlock(&p_msg_q->list_mutex); 332e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 333e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti LOC_LOGD("%s: Message Queue unblocked\n", __FUNCTION__); 334e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti 335e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti return eMSG_Q_SUCCESS; 336e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti} 337