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 <stdio.h>
30e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <assert.h>
31e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <errno.h>
32e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <sys/time.h>
33e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <string.h>
34e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <pthread.h>
35e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
36e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <rpc/rpc.h>
37e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <loc_api_rpc_glue.h>
38e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include "loc_api_sync_call.h"
39e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
40e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/* Logging */
41e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#define LOG_TAG "LocSvc_api_rpc_glue"
42e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti// #define LOG_NDDEBUG 0
43e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#ifndef USE_GLIB
44e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#include <utils/Log.h>
45e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti#endif /* USE_GLIB */
46e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
47e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/***************************************************************************
48e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti *                 DATA FOR ASYNCHRONOUS RPC PROCESSING
49e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti **************************************************************************/
50e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletiloc_sync_call_slot_array_s_type loc_sync_data;
51e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
52e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletipthread_mutex_t loc_sync_call_mutex = PTHREAD_MUTEX_INITIALIZER;
53e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletiboolean loc_sync_call_inited = 0;
54e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
55e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
56e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
57e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_api_sync_call_init
58e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
59e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
60e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Initialize this module
61e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
62e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
63e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
64e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
65e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
66e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   none
67e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
68e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
69e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
70e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
71e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
72e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_api_sync_call_init()
73e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
74e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   pthread_mutex_lock(&loc_sync_call_mutex);
75e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (loc_sync_call_inited == 1) {
76e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti       pthread_mutex_unlock(&loc_sync_call_mutex);
77e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti       return;
78e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
79e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_sync_call_inited = 1;
80e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
81e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_sync_data.num_of_slots = LOC_SYNC_CALL_SLOTS_MAX;
82e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
83e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int i;
84e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   for (i = 0; i < loc_sync_data.num_of_slots; i++)
85e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
86e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
87e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
88e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_init(&slot->lock, NULL);
89e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_cond_init(&slot->loc_cb_arrived_cond, NULL);
90e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
91e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      slot->not_available = 0;
92e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      slot->in_use = 0;
93e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      slot->loc_handle = -1;
94e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      slot->loc_cb_wait_event_mask = 0;       /* event to wait   */
95e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      slot->loc_cb_received_event_mask = 0;   /* received event   */
96e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
97e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
98e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   pthread_mutex_unlock(&loc_sync_call_mutex);
99e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
100e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
101e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
102e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
103e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_api_sync_call_destroy
104e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
105e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
106e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Initialize this module
107e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
108e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
109e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
110e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
111e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
112e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   none
113e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
114e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
115e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
116e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
117e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
118e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_api_sync_call_destroy()
119e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
120e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int i;
121e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
122e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   pthread_mutex_lock(&loc_sync_call_mutex);
123e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (loc_sync_call_inited == 0) {
124e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti       pthread_mutex_unlock(&loc_sync_call_mutex);
125e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti       return;
126e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
127e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_sync_call_inited = 0;
128e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
129e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   for (i = 0; i < loc_sync_data.num_of_slots; i++)
130e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
131e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
132e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
133e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_lock(&slot->lock);
134e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
135e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      slot->not_available = 1;
136e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
137e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_unlock(&slot->lock);
138e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
139e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_cond_destroy(&slot->loc_cb_arrived_cond);
140e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_destroy(&slot->lock);
141e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
142e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
143e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   pthread_mutex_unlock(&loc_sync_call_mutex);
144e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
145e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
146e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
147e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
148e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_match_callback
149e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
150e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
151e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Checks if an awaited event has arrived
152e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
153e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
154e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   TRUE                 arrived
155e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   FALSE                not matching
156e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
157e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
158e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic boolean loc_match_callback(
159e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_event_mask_type             wait_mask,
160e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_e_type                wait_ioctl,
161e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_event_mask_type             event_mask,
162e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      const rpc_loc_event_payload_u_type  *callback_payload
163e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti)
164e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
165e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if ((event_mask & wait_mask) == 0) return FALSE;
166e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
167e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (event_mask != RPC_LOC_EVENT_IOCTL_REPORT || wait_ioctl == 0 ||
168e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        ( (callback_payload != NULL) &&
169e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         callback_payload->rpc_loc_event_payload_u_type_u.ioctl_report.type == wait_ioctl) )
170e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      return TRUE;
171e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
172e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   return FALSE;
173e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
174e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
175e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
176e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
177e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_api_callback_process_sync_call
178e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
179e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
180e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Wakes up blocked API calls to check if the needed callback has arrived
181e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
182e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
183e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
184e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
185e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
186e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   none
187e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
188e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
189e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
190e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
191e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
192e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletivoid loc_api_callback_process_sync_call(
193e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_client_handle_type            loc_handle,             /* handle of the client */
194e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_event_mask_type               loc_event,              /* event mask           */
195e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      const rpc_loc_event_payload_u_type*   loc_event_payload       /* payload              */
196e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti)
197e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
198e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int i;
199e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
200e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   ALOGV("loc_handle = 0x%lx, loc_event = 0x%lx", loc_handle, loc_event);
201e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   for (i = 0; i < loc_sync_data.num_of_slots; i++)
202e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
203e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
204e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
205e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_lock(&slot->lock);
206e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
207e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      if (slot->in_use &&
208e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti          slot->signal_sent == 0 &&
209e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti          slot->loc_handle == loc_handle &&
210e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti          loc_match_callback(slot->loc_cb_wait_event_mask, slot->ioctl_type, loc_event, loc_event_payload))
211e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      {
212e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         memcpy(&slot->loc_cb_received_payload, loc_event_payload, sizeof (rpc_loc_event_payload_u_type));
213e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
214e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         slot->loc_cb_received_event_mask = loc_event;
215e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
216e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         ALOGV("signal slot %d in_use %d, loc_handle 0x%lx, event_mask 0x%1x, ioctl_type %d", i, slot->in_use, slot->loc_handle, (int) slot->loc_cb_wait_event_mask, (int) slot->ioctl_type);
217e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         pthread_cond_signal(&slot->loc_cb_arrived_cond);
218e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         slot->signal_sent = 1;
219e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
220e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         pthread_mutex_unlock(&slot->lock);
221e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         break;
222e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      } else {
223e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         /* do nothing */
224e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      }
225e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
226e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_unlock(&slot->lock);
227e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
228e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
229e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
230e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
231e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
232e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_lock_a_slot
233e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
234e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
235e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Allocates a buffer slot for the synchronous API call
236e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
237e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
238e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
239e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
240e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
241e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Select ID (>=0)     : successful
242e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   -1                  : buffer full
243e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
244e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
245e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
246e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
247e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
248e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic int loc_lock_a_slot()
249e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
250e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int i, select_id = -1; /* no free buffer */
251e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
252e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   for (i = 0; i < loc_sync_data.num_of_slots; i++)
253e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
254e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[i];
255e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      if (pthread_mutex_trylock(&slot->lock) == EBUSY)
256e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      {
257e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         ALOGV("trylock EBUSY : %d", i);
258e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         continue;
259e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      }
260e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
261e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      if (!slot->in_use && !slot->not_available)
262e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      {
263e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         select_id = i;
264e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         /* Return from here and leave the mutex locked.
265e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti          * will unlock it in loc_unlock_slot()
266e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti          */
267e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         break;
268e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      }
269e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      /* ALOGV("slot %d in_use = %d, not_available = %d : %d", i, slot->in_use, slot->not_available, i); */
270e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      pthread_mutex_unlock(&slot->lock);
271e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
272e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
273e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   return select_id;
274e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
275e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
276e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
277e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
278e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_unlock_slot
279e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
280e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
281e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Unlocks a buffer slot
282e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
283e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
284e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
285e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
286e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
287e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   None
288e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
289e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
290e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
291e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
292e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
293e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void loc_unlock_slot(int select_id)
294e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
295e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   pthread_mutex_unlock(&loc_sync_data.slots[select_id].lock);
296e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
297e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
298e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
299e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
300e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_lock_slot
301e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
302e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
303e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Locks a specific slot that was previously locked from loc_lock_a_slot
304e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
305e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
306e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
307e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
308e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
309e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   None
310e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
311e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
312e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
313e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
314e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
315e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void loc_lock_slot(int select_id)
316e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
317e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    pthread_mutex_lock(&loc_sync_data.slots[select_id].lock);
318e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
319e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
320e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
321e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
322e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_set_slot_in_use
323e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
324e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
325e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Sets the in_use flag of slot to true or false.
326e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Should be called only after the slot is locked
327e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
328e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
329e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
330e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
331e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
332e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   None
333e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
334e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
335e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
336e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
337e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
338e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void loc_set_slot_in_use(int select_id, boolean in_use)
339e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
340e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    loc_sync_data.slots[select_id].in_use = in_use;
341e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti    if (in_use == 1)
342e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti        loc_sync_data.slots[select_id].signal_sent = 0;
343e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
344e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
345e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
346e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
347e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_api_save_callback
348e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
349e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
350e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Selects which callback or IOCTL event to wait for.
351e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
352e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   The event_mask specifies the event(s). If it is RPC_LOC_EVENT_IOCTL_REPORT,
353e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   then ioctl_type specifies the IOCTL event.
354e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
355e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   If ioctl_type is non-zero, RPC_LOC_EVENT_IOCTL_REPORT is automatically added.
356e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
357e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
358e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
359e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
360e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
361e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Select ID (>=0)     : successful
362e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   -1                  : out of buffer
363e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
364e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
365e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
366e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
367e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
368e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void loc_api_save_callback(
369e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      int                              select_id,            /* Selected slot */
370e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_client_handle_type       loc_handle,           /* Client handle */
371e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_event_mask_type          event_mask,           /* Event mask to wait for */
372e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_e_type             ioctl_type            /* IOCTL type to wait for */
373e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti)
374e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
375e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[select_id];
376e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
377e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   slot->loc_handle = loc_handle;
378e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
379e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   slot->loc_cb_wait_event_mask = event_mask;
380e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   slot->ioctl_type = ioctl_type;
381e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (ioctl_type) slot->loc_cb_wait_event_mask |= RPC_LOC_EVENT_IOCTL_REPORT;
382e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
383e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   return;
384e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
385e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
386e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
387e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
388e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_save_user_payload
389e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
390e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
391e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Saves received payload into user data structures
392e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
393e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
394e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   None
395e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
396e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
397e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic void loc_save_user_payload(
398e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_event_payload_u_type  *user_cb_payload,
399e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_callback_s_type *user_ioctl_buffer,
400e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      const rpc_loc_event_payload_u_type  *received_cb_payload
401e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti)
402e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
403e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (user_cb_payload)
404e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
405e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      memcpy(user_cb_payload, received_cb_payload,
406e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            sizeof (rpc_loc_event_payload_u_type));
407e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
408e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (user_ioctl_buffer)
409e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
410e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      memcpy(user_ioctl_buffer,
411e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            &received_cb_payload->rpc_loc_event_payload_u_type_u.ioctl_report,
412e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            sizeof *user_ioctl_buffer);
413e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
414e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
415e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
416e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
417e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
418e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_api_wait_callback
419e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
420e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
421e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Waits for a selected callback. The wait expires in timeout_seconds seconds.
422e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
423e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   If the function is called before an existing wait has finished, it will
424e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   immediately return EBUSY.
425e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
426e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
427e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
428e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
429e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
430e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   RPC_LOC_API_SUCCESS              if successful (0)
431e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   RPC_LOC_API_TIMEOUT              if timed out
432e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   RPC_LOC_API_ENGINE_BUSY          if already in a wait
433e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   RPC_LOC_API_INVALID_PARAMETER    if callback is not yet selected
434e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
435e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
436e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
437e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
438e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
439e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletistatic int loc_api_wait_callback(
440e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      int select_id,        /* ID from loc_select_callback() */
441e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      int timeout_seconds,  /* Timeout in this number of seconds  */
442e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_event_payload_u_type     *callback_payload,    /* Pointer to callback payload buffer, can be NULL */
443e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_callback_s_type    *ioctl_payload        /* Pointer to IOCTL payload, can be NULL */
444e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti)
445e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
446e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int ret_val = RPC_LOC_API_SUCCESS;  /* the return value of this function: 0 = no error */
447e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int rc = 0;                         /* return code from pthread calls */
448e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
449e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   struct timespec expire_time;
450e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
451e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_sync_call_slot_s_type *slot = &loc_sync_data.slots[select_id];
452e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
453e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   clock_gettime(CLOCK_REALTIME, &expire_time);
454e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   expire_time.tv_sec += timeout_seconds;
455e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
456e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   /* Waiting */
457e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   while (slot->signal_sent == 0 && rc != ETIMEDOUT) {
458e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti       rc = pthread_cond_timedwait(&slot->loc_cb_arrived_cond,
459e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti             &slot->lock, &expire_time);
460e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
461e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
462e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (rc == ETIMEDOUT)
463e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
464e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      ret_val = RPC_LOC_API_TIMEOUT; /* Timed out */
465e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      ALOGE("TIMEOUT: %d", select_id);
466e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
467e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   else {
468e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      /* Obtained the first awaited callback */
469e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      ret_val = RPC_LOC_API_SUCCESS;       /* Successful */
470e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      loc_save_user_payload(callback_payload, ioctl_payload, &slot->loc_cb_received_payload);
471e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
472e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
473e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   return ret_val;
474e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
475e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
476e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti/*===========================================================================
477e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
478e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiFUNCTION    loc_api_sync_ioctl
479e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
480e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDESCRIPTION
481e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Synchronous IOCTL call (reentrant version)
482e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
483e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiDEPENDENCIES
484e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
485e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
486e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiRETURN VALUE
487e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   Loc API error code (0 = success)
488e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
489e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore PasupuletiSIDE EFFECTS
490e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   N/A
491e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
492e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti===========================================================================*/
493e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuletiint loc_api_sync_ioctl
494e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti(
495e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_client_handle_type           handle,
496e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_e_type                 ioctl_type,
497e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_data_u_type*           ioctl_data_ptr,
498e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      uint32                               timeout_msec,
499e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      rpc_loc_ioctl_callback_s_type       *cb_data_ptr
500e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti)
501e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti{
502e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int                              rc = -1;
503e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   int                              select_id;
504e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   rpc_loc_ioctl_callback_s_type    callback_data;
505e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
506e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   select_id = loc_lock_a_slot();
507e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
508e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (select_id < 0 || select_id >= loc_sync_data.num_of_slots)
509e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
510e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      ALOGE("slot not available ioctl_type = %s",
511e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti           loc_get_ioctl_type_name(ioctl_type));
512e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      return rc;
513e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
514e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
515e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_set_slot_in_use(select_id, 1); // set slot in use to true
516e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
517e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   // Select the callback we are waiting for
518e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_api_save_callback(select_id, handle, 0, ioctl_type);
519e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
520e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_unlock_slot(select_id); // slot is unlocked, but in_use is still true
521e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
522e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   // we want to avoid keeping the slot locked during the loc_ioctl because the rpc
523e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   // framework will also lock a different mutex during this call, and typically
524e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   // locking two different mutexes at the same time can lead to deadlock.
525e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   rc =  loc_ioctl(handle, ioctl_type, ioctl_data_ptr);
526e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
527e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_lock_slot(select_id);
528e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
529e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   if (rc != RPC_LOC_API_SUCCESS)
530e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   {
531e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      ALOGE("loc_ioctl failed select_id = %d, ioctl_type %s, returned %s",
532e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti           select_id, loc_get_ioctl_type_name(ioctl_type), loc_get_ioctl_status_name(rc));
533e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   }
534e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   else {
535e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      ALOGV("select_id = %d, ioctl_type %d, returned RPC_LOC_API_SUCCESS",
536e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti          select_id, ioctl_type);
537e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      // Wait for the callback of loc_ioctl
538e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      if ((rc = loc_api_wait_callback(select_id, timeout_msec / 1000, NULL, &callback_data)) != 0)
539e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      {
540e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         // Callback waiting failed
541e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         ALOGE("callback wait failed select_id = %d, ioctl_type %s, returned %s",
542e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti              select_id, loc_get_ioctl_type_name(ioctl_type), loc_get_ioctl_status_name(rc));
543e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      }
544e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      else
545e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      {
546e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         if (cb_data_ptr) memcpy(cb_data_ptr, &callback_data, sizeof *cb_data_ptr);
547e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         if (callback_data.status != RPC_LOC_API_SUCCESS)
548e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         {
549e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            rc = callback_data.status;
550e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            ALOGE("callback status failed select_id = %d, ioctl_type %s, returned %s",
551e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                 select_id, loc_get_ioctl_type_name(ioctl_type), loc_get_ioctl_status_name(rc));
552e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         } else {
553e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti            ALOGV("callback status success select_id = %d, ioctl_type %d, returned %d",
554e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti                select_id, ioctl_type, rc);
555e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti         }
556e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti      } /* wait callback */
557e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   } /* loc_ioctl */
558e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
559e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_set_slot_in_use(select_id, 0); // set slot in use to false
560e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   loc_unlock_slot(select_id);
561e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
562e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti   return rc;
563e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti}
564e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
565e7c98642e1e156ea6cde1238cd0006f669cfb696Uday Kishore Pasupuleti
566