147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 2e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * 3e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * Redistribution and use in source and binary forms, with or without 4e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * modification, are permitted provided that the following conditions are 5e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * met: 6e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Redistributions of source code must retain the above copyright 7e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * notice, this list of conditions and the following disclaimer. 8e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Redistributions in binary form must reproduce the above 9e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * copyright notice, this list of conditions and the following 10e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * disclaimer in the documentation and/or other materials provided 11e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * with the distribution. 12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Neither the name of The Linux Foundation, nor the names of its 13e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * contributors may be used to endorse or promote products derived 14e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * from this software without specific prior written permission. 15e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * 16e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * 28e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo */ 29e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#define LOG_NDDEBUG 0 30e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#define LOG_TAG "LocSvc_DualCtx" 31e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 32e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <cutils/sched_policy.h> 33e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <unistd.h> 34e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <LocDualContext.h> 35e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <msg_q.h> 36e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <log_util.h> 37e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include <loc_log.h> 38e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 39e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russonamespace loc_core { 40e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 41e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo// nothing exclude for foreground 42e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst LOC_API_ADAPTER_EVENT_MASK_T 43e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocDualContext::mFgExclMask = 0; 44e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo// excluded events for background clients 45e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst LOC_API_ADAPTER_EVENT_MASK_T 46e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocDualContext::mBgExclMask = 4747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo (LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT | 4847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_API_ADAPTER_BIT_SATELLITE_REPORT | 49e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT | 50e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT | 51e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_IOCTL_REPORT | 52e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_BIT_STATUS_REPORT | 538aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT | 548aac9d301fc5aa83071492803f4335b73f2604e3Vineeta Srivastava LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT); 55e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 56e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst MsgTask* LocDualContext::mMsgTask = NULL; 57e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoContextBase* LocDualContext::mFgContext = NULL; 58e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoContextBase* LocDualContext::mBgContext = NULL; 5947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante RussoContextBase* LocDualContext::mInjectContext = NULL; 60e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo// the name must be shorter than 15 chars 61e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst char* LocDualContext::mLocationHalName = "Loc_hal_worker"; 6247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russoconst char* LocDualContext::mLBSLibName = "liblbs_core.so"; 63e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 64e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst MsgTask* LocDualContext::getMsgTask(MsgTask::tCreate tCreator, 65e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const char* name) 66e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 67e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (NULL == mMsgTask) { 68e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mMsgTask = new MsgTask(tCreator, name); 69e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 70e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return mMsgTask; 71e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 72e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 73e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russoconst MsgTask* LocDualContext::getMsgTask(MsgTask::tAssociate tAssociate, 74e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const char* name) 75e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 76e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (NULL == mMsgTask) { 77e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mMsgTask = new MsgTask(tAssociate, name); 7847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } else if (tAssociate) { 7947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo mMsgTask->associate(tAssociate); 80e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 81e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return mMsgTask; 82e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 83e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 84e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoContextBase* LocDualContext::getLocFgContext(MsgTask::tCreate tCreator, 85e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const char* name) 86e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 87e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (NULL == mFgContext) { 88e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const MsgTask* msgTask = getMsgTask(tCreator, name); 89e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mFgContext = new LocDualContext(msgTask, 90e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mFgExclMask); 91e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 9247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL == mInjectContext) { 9347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo mInjectContext = mFgContext; 9447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo injectFeatureConfig(mInjectContext); 9547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 96e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return mFgContext; 97e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 98e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 99e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoContextBase* LocDualContext::getLocFgContext(MsgTask::tAssociate tAssociate, 100e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const char* name) 101e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 102e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (NULL == mFgContext) { 103e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const MsgTask* msgTask = getMsgTask(tAssociate, name); 104e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mFgContext = new LocDualContext(msgTask, 105e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mFgExclMask); 106e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 10747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL == mInjectContext) { 10847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: mInjectContext is FgContext", __func__, __LINE__); 10947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo mInjectContext = mFgContext; 11047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo injectFeatureConfig(mInjectContext); 11147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 112e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return mFgContext; 113e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 114e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 115e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 116e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoContextBase* LocDualContext::getLocBgContext(MsgTask::tCreate tCreator, 117e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const char* name) 118e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 119e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (NULL == mBgContext) { 120e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const MsgTask* msgTask = getMsgTask(tCreator, name); 121e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mBgContext = new LocDualContext(msgTask, 122e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mBgExclMask); 123e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 12447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL == mInjectContext) { 12547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__); 12647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo mInjectContext = mBgContext; 12747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo injectFeatureConfig(mInjectContext); 12847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 129e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return mBgContext; 130e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 131e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 132e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoContextBase* LocDualContext::getLocBgContext(MsgTask::tAssociate tAssociate, 133e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const char* name) 134e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 135e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo if (NULL == mBgContext) { 136e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo const MsgTask* msgTask = getMsgTask(tAssociate, name); 137e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mBgContext = new LocDualContext(msgTask, 138e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo mBgExclMask); 139e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo } 14047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(NULL == mInjectContext) { 14147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__); 14247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo mInjectContext = mBgContext; 14347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo injectFeatureConfig(mInjectContext); 14447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 145e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo return mBgContext; 146e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 147e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 14847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russovoid LocDualContext :: injectFeatureConfig(ContextBase *curContext) 14947ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo{ 15047ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: Enter", __func__, __LINE__); 15147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo if(curContext == mInjectContext) { 15247ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: Calling LBSProxy (%p) to inject feature config", 15347ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo __func__, __LINE__, ((LocDualContext *)mInjectContext)->mLBSProxy); 15447ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ((LocDualContext *)mInjectContext)->mLBSProxy->injectFeatureConfig(curContext); 15547ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo } 15647ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo LOC_LOGD("%s:%d]: Exit", __func__, __LINE__); 15747ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo} 15847ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo 159e14a6c846df2ce4bb1847e4250991f7c52fd793dDante RussoLocDualContext::LocDualContext(const MsgTask* msgTask, 160e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo LOC_API_ADAPTER_EVENT_MASK_T exMask) : 16147ad5e4cf2f6810db3c0e7ec79696496a94b6f0dDante Russo ContextBase(msgTask, exMask, mLBSLibName) 162e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo{ 163e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 164e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo 165e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo} 166