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:
Tushar Janefalkar 2014-01-28 11:41:14 -08:00 committed by Gerrit - the friendly Code Review server
parent 7284ef63e7
commit 48c29f5a8f
2 changed files with 42 additions and 28 deletions

View file

@ -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 &params) { return false;} inline virtual bool sendFixMode(LocPosMode &params) {
mPosMode = params;
return false;
}
inline virtual bool reportPosition(UlpLocation &location, inline virtual bool reportPosition(UlpLocation &location,
GpsLocationExtended &locationExtended, GpsLocationExtended &locationExtended,
void* locationExt, void* locationExt,

View file

@ -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));
} }