diff options
author | qctecmdr <qctecmdr@localhost> | 2019-08-19 11:21:18 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-08-19 11:21:18 -0700 |
commit | 5ee0b62e8c53ba6a57300541dbbae6b2e9cf9a8a (patch) | |
tree | 940f238e62741f3f20fa1b1dfbbb909dab6c839b | |
parent | f103622b365fc3a01902db72018da3712dbf0bed (diff) | |
parent | 32e36b84e103862364a8a037272156b2b3814b6f (diff) | |
download | gps-5ee0b62e8c53ba6a57300541dbbae6b2e9cf9a8a.tar.gz |
Merge "delete of shared LocApiBase::mMsgTask may cause issues"
-rw-r--r-- | core/LocApiBase.cpp | 14 | ||||
-rw-r--r-- | core/LocApiBase.h | 9 | ||||
-rw-r--r-- | utils/Makefile.am | 1 |
3 files changed, 16 insertions, 8 deletions
diff --git a/core/LocApiBase.cpp b/core/LocApiBase.cpp index ef204ec..14472fa 100644 --- a/core/LocApiBase.cpp +++ b/core/LocApiBase.cpp @@ -148,7 +148,8 @@ struct LocCloseMsg : public LocMsg { } }; -MsgTask* LocApiBase::mMsgTask; +MsgTask* LocApiBase::mMsgTask = nullptr; +volatile int32_t LocApiBase::mMsgTaskRefCount = 0; LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask, ContextBase* context) : @@ -157,6 +158,7 @@ LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask, { memset(mLocAdapters, 0, sizeof(mLocAdapters)); + android_atomic_inc(&mMsgTaskRefCount); if (nullptr == mMsgTask) { mMsgTask = new MsgTask("LocApiMsgTask", false); } @@ -230,7 +232,7 @@ void LocApiBase::addAdapter(LocAdapterBase* adapter) for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) { if (mLocAdapters[i] == NULL) { mLocAdapters[i] = adapter; - mMsgTask->sendMsg(new LocOpenMsg(this, adapter)); + sendMsg(new LocOpenMsg(this, adapter)); break; } } @@ -263,10 +265,10 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter) // if we have an empty list of adapters if (0 == i) { - mMsgTask->sendMsg(new LocCloseMsg(this)); + sendMsg(new LocCloseMsg(this)); } else { // else we need to remove the bit - mMsgTask->sendMsg(new LocOpenMsg(this)); + sendMsg(new LocOpenMsg(this)); } } } @@ -274,7 +276,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter) void LocApiBase::updateEvtMask() { - mMsgTask->sendMsg(new LocOpenMsg(this)); + sendMsg(new LocOpenMsg(this)); } void LocApiBase::updateNmeaMask(uint32_t mask) @@ -298,7 +300,7 @@ void LocApiBase::updateNmeaMask(uint32_t mask) } }; - mMsgTask->sendMsg(new LocSetNmeaMsg(this, mask)); + sendMsg(new LocSetNmeaMsg(this, mask)); } void LocApiBase::handleEngineUpEvent() diff --git a/core/LocApiBase.h b/core/LocApiBase.h index 8c885f7..6dac585 100644 --- a/core/LocApiBase.h +++ b/core/LocApiBase.h @@ -34,6 +34,7 @@ #include <gps_extended.h> #include <LocationAPI.h> #include <MsgTask.h> +#include <LocSharedLock.h> #include <log_util.h> namespace loc_core { @@ -107,6 +108,7 @@ class LocApiBase { friend struct LocKillMsg; friend class ContextBase; static MsgTask* mMsgTask; + static volatile int32_t mMsgTaskRefCount; LocAdapterBase* mLocAdapters[MAX_ADAPTERS]; protected: @@ -121,7 +123,8 @@ protected: LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask, ContextBase* context = NULL); inline virtual ~LocApiBase() { - if (nullptr != mMsgTask) { + android_atomic_dec(&mMsgTaskRefCount); + if (nullptr != mMsgTask && 0 == mMsgTaskRefCount) { mMsgTask->destroy(); mMsgTask = nullptr; } @@ -132,7 +135,9 @@ protected: public: inline void sendMsg(const LocMsg* msg) const { - mMsgTask->sendMsg(msg); + if (nullptr != mMsgTask) { + mMsgTask->sendMsg(msg); + } } inline void destroy() { close(); diff --git a/utils/Makefile.am b/utils/Makefile.am index 807916d..9a9c67e 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -29,6 +29,7 @@ libgps_utils_la_h_sources = \ gps_extended.h \ loc_gps.h \ log_util.h \ + LocSharedLock.h \ LocUnorderedSetMap.h libgps_utils_la_c_sources = \ |