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