Copy position mode to dummy ULP proxy
To avoid the race condition between when the fix criteria is set and checked, the position mode is copied to the dummy ULP proxy and it is used to inform ULP when a true proxy is registered Change-Id: I72285c7926814ec85dae64e6634f0c79ea5e6c51 CRs-fixed: 604905
This commit is contained in:
parent
7e53be85c9
commit
e620608cd7
2 changed files with 42 additions and 28 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
|
@ -37,11 +37,19 @@ class LocAdapterBase;
|
||||||
|
|
||||||
class UlpProxyBase {
|
class UlpProxyBase {
|
||||||
public:
|
public:
|
||||||
inline UlpProxyBase() {}
|
LocPosMode mPosMode;
|
||||||
|
bool mFixSet;
|
||||||
|
inline UlpProxyBase() {
|
||||||
|
mPosMode.mode = LOC_POSITION_MODE_INVALID;
|
||||||
|
mFixSet = false;
|
||||||
|
}
|
||||||
inline virtual ~UlpProxyBase() {}
|
inline virtual ~UlpProxyBase() {}
|
||||||
inline virtual bool sendStartFix() { return false;}
|
inline virtual bool sendStartFix() { mFixSet = true; return false; }
|
||||||
inline virtual bool sendStopFix() { return false;}
|
inline virtual bool sendStopFix() { mFixSet = false; return false; }
|
||||||
inline virtual bool sendFixMode(LocPosMode ¶ms) { return false;}
|
inline virtual bool sendFixMode(LocPosMode ¶ms) {
|
||||||
|
mPosMode = params;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
inline virtual bool reportPosition(UlpLocation &location,
|
inline virtual bool reportPosition(UlpLocation &location,
|
||||||
GpsLocationExtended &locationExtended,
|
GpsLocationExtended &locationExtended,
|
||||||
void* locationExt,
|
void* locationExt,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* modification, are permitted provided that the following conditions are
|
||||||
|
@ -52,22 +52,6 @@ void LocInternalAdapter::stopFixInt() {
|
||||||
void LocInternalAdapter::getZppInt() {
|
void LocInternalAdapter::getZppInt() {
|
||||||
sendMsg(new LocEngGetZpp(mLocEngAdapter));
|
sendMsg(new LocEngGetZpp(mLocEngAdapter));
|
||||||
}
|
}
|
||||||
void LocInternalAdapter::setUlpProxy(UlpProxyBase* ulp) {
|
|
||||||
struct LocSetUlpProxy : public LocMsg {
|
|
||||||
LocAdapterBase* mAdapter;
|
|
||||||
UlpProxyBase* mUlp;
|
|
||||||
inline LocSetUlpProxy(LocAdapterBase* adapter, UlpProxyBase* ulp) :
|
|
||||||
LocMsg(), mAdapter(adapter), mUlp(ulp) {
|
|
||||||
}
|
|
||||||
virtual void proc() const {
|
|
||||||
LOC_LOGV("%s] ulp %p adapter %p", __func__,
|
|
||||||
mUlp, mAdapter);
|
|
||||||
mAdapter->setUlpProxy(mUlp);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
sendMsg(new LocSetUlpProxy(mLocEngAdapter, ulp));
|
|
||||||
}
|
|
||||||
|
|
||||||
LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
|
LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||||
void* owner, ContextBase* context,
|
void* owner, ContextBase* context,
|
||||||
|
@ -95,6 +79,23 @@ LocEngAdapter::~LocEngAdapter()
|
||||||
LOC_LOGV("LocEngAdapter deleted");
|
LOC_LOGV("LocEngAdapter deleted");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LocInternalAdapter::setUlpProxy(UlpProxyBase* ulp) {
|
||||||
|
struct LocSetUlpProxy : public LocMsg {
|
||||||
|
LocAdapterBase* mAdapter;
|
||||||
|
UlpProxyBase* mUlp;
|
||||||
|
inline LocSetUlpProxy(LocAdapterBase* adapter, UlpProxyBase* ulp) :
|
||||||
|
LocMsg(), mAdapter(adapter), mUlp(ulp) {
|
||||||
|
}
|
||||||
|
virtual void proc() const {
|
||||||
|
LOC_LOGV("%s] ulp %p adapter %p", __func__,
|
||||||
|
mUlp, mAdapter);
|
||||||
|
mAdapter->setUlpProxy(mUlp);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
sendMsg(new LocSetUlpProxy(mLocEngAdapter, ulp));
|
||||||
|
}
|
||||||
|
|
||||||
void LocEngAdapter::setUlpProxy(UlpProxyBase* ulp)
|
void LocEngAdapter::setUlpProxy(UlpProxyBase* ulp)
|
||||||
{
|
{
|
||||||
if (ulp == mUlp) {
|
if (ulp == mUlp) {
|
||||||
|
@ -102,18 +103,24 @@ void LocEngAdapter::setUlpProxy(UlpProxyBase* ulp)
|
||||||
//and we get the same object back for UlpProxyBase . Do nothing
|
//and we get the same object back for UlpProxyBase . Do nothing
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
delete mUlp;
|
|
||||||
LOC_LOGV("%s] %p", __func__, ulp);
|
LOC_LOGV("%s] %p", __func__, ulp);
|
||||||
if (NULL == ulp) {
|
if (NULL == ulp) {
|
||||||
|
LOC_LOGE("%s:%d]: ulp pointer is NULL", __func__, __LINE__);
|
||||||
ulp = new UlpProxyBase();
|
ulp = new UlpProxyBase();
|
||||||
}
|
}
|
||||||
mUlp = ulp;
|
|
||||||
|
|
||||||
if (LOC_POSITION_MODE_INVALID != mFixCriteria.mode) {
|
if (LOC_POSITION_MODE_INVALID != mUlp->mPosMode.mode) {
|
||||||
// need to send this mode and start msg to ULP
|
// need to send this mode and start msg to ULP
|
||||||
mUlp->sendFixMode(mFixCriteria);
|
ulp->sendFixMode(mUlp->mPosMode);
|
||||||
mUlp->sendStartFix();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(mUlp->mFixSet) {
|
||||||
|
ulp->sendStartFix();
|
||||||
|
}
|
||||||
|
|
||||||
|
delete mUlp;
|
||||||
|
mUlp = ulp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocInternalAdapter::reportPosition(UlpLocation &location,
|
void LocInternalAdapter::reportPosition(UlpLocation &location,
|
||||||
|
@ -294,4 +301,3 @@ void LocEngAdapter::handleEngineUpEvent()
|
||||||
{
|
{
|
||||||
sendMsg(new LocEngUp(mOwner));
|
sendMsg(new LocEngUp(mOwner));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue