1 /* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation, nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29 #define LOG_NDDEBUG 0
30 #define LOG_TAG "LocSvc_DualCtx"
31
32 #include <cutils/sched_policy.h>
33 #include <unistd.h>
34 #include <LocDualContext.h>
35 #include <msg_q.h>
36 #include <log_util.h>
37 #include <loc_log.h>
38
39 namespace loc_core {
40
41 // nothing exclude for foreground
42 const LOC_API_ADAPTER_EVENT_MASK_T
43 LocDualContext::mFgExclMask = 0;
44 // excluded events for background clients
45 const LOC_API_ADAPTER_EVENT_MASK_T
46 LocDualContext::mBgExclMask =
47 (LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
48 LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
49 LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
50 LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT |
51 LOC_API_ADAPTER_BIT_IOCTL_REPORT |
52 LOC_API_ADAPTER_BIT_STATUS_REPORT |
53 LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT |
54 LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT);
55
56 const MsgTask* LocDualContext::mMsgTask = NULL;
57 ContextBase* LocDualContext::mFgContext = NULL;
58 ContextBase* LocDualContext::mBgContext = NULL;
59 ContextBase* LocDualContext::mInjectContext = NULL;
60 // the name must be shorter than 15 chars
61 const char* LocDualContext::mLocationHalName = "Loc_hal_worker";
62 const char* LocDualContext::mLBSLibName = "liblbs_core.so";
63
64 pthread_mutex_t LocDualContext::mGetLocContextMutex = PTHREAD_MUTEX_INITIALIZER;
65
getMsgTask(MsgTask::tCreate tCreator,const char * name)66 const MsgTask* LocDualContext::getMsgTask(MsgTask::tCreate tCreator,
67 const char* name)
68 {
69 if (NULL == mMsgTask) {
70 mMsgTask = new MsgTask(tCreator, name);
71 }
72 return mMsgTask;
73 }
74
getMsgTask(MsgTask::tAssociate tAssociate,const char * name)75 const MsgTask* LocDualContext::getMsgTask(MsgTask::tAssociate tAssociate,
76 const char* name)
77 {
78 if (NULL == mMsgTask) {
79 mMsgTask = new MsgTask(tAssociate, name);
80 } else if (tAssociate) {
81 mMsgTask->associate(tAssociate);
82 }
83 return mMsgTask;
84 }
85
getLocFgContext(MsgTask::tCreate tCreator,const char * name)86 ContextBase* LocDualContext::getLocFgContext(MsgTask::tCreate tCreator,
87 const char* name)
88 {
89 pthread_mutex_lock(&LocDualContext::mGetLocContextMutex);
90 LOC_LOGD("%s:%d]: querying ContextBase with tCreator", __func__, __LINE__);
91 if (NULL == mFgContext) {
92 LOC_LOGD("%s:%d]: creating msgTask with tCreator", __func__, __LINE__);
93 const MsgTask* msgTask = getMsgTask(tCreator, name);
94 mFgContext = new LocDualContext(msgTask,
95 mFgExclMask);
96 }
97 if(NULL == mInjectContext) {
98 LOC_LOGD("%s:%d]: mInjectContext is FgContext", __func__, __LINE__);
99 mInjectContext = mFgContext;
100 injectFeatureConfig(mInjectContext);
101 }
102 pthread_mutex_unlock(&LocDualContext::mGetLocContextMutex);
103 return mFgContext;
104 }
105
getLocFgContext(MsgTask::tAssociate tAssociate,const char * name)106 ContextBase* LocDualContext::getLocFgContext(MsgTask::tAssociate tAssociate,
107 const char* name)
108 {
109 pthread_mutex_lock(&LocDualContext::mGetLocContextMutex);
110 LOC_LOGD("%s:%d]: querying ContextBase with tAssociate", __func__, __LINE__);
111 if (NULL == mFgContext) {
112 LOC_LOGD("%s:%d]: creating msgTask with tAssociate", __func__, __LINE__);
113 const MsgTask* msgTask = getMsgTask(tAssociate, name);
114 mFgContext = new LocDualContext(msgTask,
115 mFgExclMask);
116 }
117 if(NULL == mInjectContext) {
118 LOC_LOGD("%s:%d]: mInjectContext is FgContext", __func__, __LINE__);
119 mInjectContext = mFgContext;
120 injectFeatureConfig(mInjectContext);
121 }
122 pthread_mutex_unlock(&LocDualContext::mGetLocContextMutex);
123 return mFgContext;
124 }
125
getLocBgContext(MsgTask::tCreate tCreator,const char * name)126 ContextBase* LocDualContext::getLocBgContext(MsgTask::tCreate tCreator,
127 const char* name)
128 {
129 pthread_mutex_lock(&LocDualContext::mGetLocContextMutex);
130 LOC_LOGD("%s:%d]: querying ContextBase with tCreator", __func__, __LINE__);
131 if (NULL == mBgContext) {
132 LOC_LOGD("%s:%d]: creating msgTask with tCreator", __func__, __LINE__);
133 const MsgTask* msgTask = getMsgTask(tCreator, name);
134 mBgContext = new LocDualContext(msgTask,
135 mBgExclMask);
136 }
137 if(NULL == mInjectContext) {
138 LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__);
139 mInjectContext = mBgContext;
140 injectFeatureConfig(mInjectContext);
141 }
142 pthread_mutex_unlock(&LocDualContext::mGetLocContextMutex);
143 return mBgContext;
144 }
145
getLocBgContext(MsgTask::tAssociate tAssociate,const char * name)146 ContextBase* LocDualContext::getLocBgContext(MsgTask::tAssociate tAssociate,
147 const char* name)
148 {
149 pthread_mutex_lock(&LocDualContext::mGetLocContextMutex);
150 LOC_LOGD("%s:%d]: querying ContextBase with tAssociate", __func__, __LINE__);
151 if (NULL == mBgContext) {
152 LOC_LOGD("%s:%d]: creating msgTask with tAssociate", __func__, __LINE__);
153 const MsgTask* msgTask = getMsgTask(tAssociate, name);
154 mBgContext = new LocDualContext(msgTask,
155 mBgExclMask);
156 }
157 if(NULL == mInjectContext) {
158 LOC_LOGD("%s:%d]: mInjectContext is BgContext", __func__, __LINE__);
159 mInjectContext = mBgContext;
160 injectFeatureConfig(mInjectContext);
161 }
162 pthread_mutex_unlock(&LocDualContext::mGetLocContextMutex);
163 return mBgContext;
164 }
165
injectFeatureConfig(ContextBase * curContext)166 void LocDualContext :: injectFeatureConfig(ContextBase *curContext)
167 {
168 LOC_LOGD("%s:%d]: Enter", __func__, __LINE__);
169 if(curContext == mInjectContext) {
170 LOC_LOGD("%s:%d]: Calling LBSProxy (%p) to inject feature config",
171 __func__, __LINE__, ((LocDualContext *)mInjectContext)->mLBSProxy);
172 ((LocDualContext *)mInjectContext)->mLBSProxy->injectFeatureConfig(curContext);
173 }
174 LOC_LOGD("%s:%d]: Exit", __func__, __LINE__);
175 }
176
LocDualContext(const MsgTask * msgTask,LOC_API_ADAPTER_EVENT_MASK_T exMask)177 LocDualContext::LocDualContext(const MsgTask* msgTask,
178 LOC_API_ADAPTER_EVENT_MASK_T exMask) :
179 ContextBase(msgTask, exMask, mLBSLibName)
180 {
181 }
182
183 }
184