/*=========================================================================== FUNCTION loc_api_select_callback DESCRIPTION Selects which callback or IOCTL event to wait for. The event_mask specifies the event(s). If it is RPC_LOC_EVENT_IOCTL_REPORT, then ioctl_type specifies the IOCTL event. If ioctl_type is non-zero, RPC_LOC_EVENT_IOCTL_REPORT is automatically added. DEPENDENCIES N/A RETURN VALUE Select ID (>=0) : successful -1 : out of buffer SIDE EFFECTS N/A ===========================================================================*/ int loc_api_select_callback( rpc_loc_client_handle_type loc_handle, /* Client handle */ rpc_loc_event_mask_type event_mask, /* Event mask to wait for */ rpc_loc_ioctl_e_type ioctl_type /* IOCTL type to wait for */ ) { int select_id = loc_alloc_slot(); if (select_id < 0) { ALOGE("loc_select_callback: buffer full for this synchronous Loc API call, mask: 0x%x", (unsigned) event_mask); return -1; } loc_sync_call_data_s_type *slot = &loc_sync_data.slots[select_id]; pthread_mutex_lock(&slot->lock); slot->loc_handle = loc_handle; slot->loc_cb_is_selected = TRUE; slot->loc_cb_is_waiting = FALSE; slot->loc_cb_has_arrived = FALSE; slot->loc_cb_wait_event_mask = event_mask; slot->ioctl_type = ioctl_type; if (ioctl_type) slot->loc_cb_wait_event_mask |= RPC_LOC_EVENT_IOCTL_REPORT; pthread_mutex_unlock(&slot->lock); return select_id; }
/*=========================================================================== FUNCTION loc_sync_select_ind DESCRIPTION Selects which indication to wait for. DEPENDENCIES N/A RETURN VALUE Select ID (>=0) : successful -ENOMEM : out of buffer SIDE EFFECTS N/A ===========================================================================*/ static int loc_sync_select_ind( locClientHandleType client_handle, /* Client handle */ uint32_t ind_id, /* ind Id wait for */ uint32_t req_id, /* req id */ void * ind_payload_ptr /* ptr where payload should be copied to*/ ) { int select_id = loc_alloc_slot(); LOC_LOGV("%s:%d]: client handle %p, ind_id %u, req_id %u \n", __func__, __LINE__, client_handle, ind_id, req_id); if (select_id < 0) { LOC_LOGE("%s:%d]: buffer full for this synchronous req %s \n", __func__, __LINE__, loc_get_v02_event_name(req_id)); return -ENOMEM; } loc_sync_req_data_s_type *slot = &loc_sync_array.slots[select_id]; pthread_mutex_lock(&slot->sync_req_lock); slot->client_handle = client_handle; slot->ind_is_selected = true; slot->ind_is_waiting = false; slot->ind_has_arrived = false; slot->recv_ind_id = ind_id; slot->req_id = req_id; slot->recv_ind_payload_ptr = ind_payload_ptr; //store the payload ptr pthread_mutex_unlock(&slot->sync_req_lock); return select_id; }