diff options
author | Kevin Tang <zhikait@codeaurora.org> | 2018-07-23 16:24:00 -0700 |
---|---|---|
committer | Kevin Tang <zhikait@codeaurora.org> | 2018-07-30 16:17:37 -0700 |
commit | a8f926020f4883aa3915b8e5e0d35e09527bbbd5 (patch) | |
tree | 116415be58b890d71b1055631f3b59ef50c4042e /core/LocApiBase.h | |
parent | aa6481f63899a072602191893c0b9e25fba758dc (diff) | |
download | gps-a8f926020f4883aa3915b8e5e0d35e09527bbbd5.tar.gz |
Delete LocApiBase and derived class on msgTask thread
Direct delete of the API obj on caller thread could result
in a race condition that caller still has close() or other
handling running at the same time the API object is being
or already deleted.
CRs-Fixed: 2275383
Change-Id: I5d3de204befec3c22c73cece8516e90800abbd35
Diffstat (limited to 'core/LocApiBase.h')
-rw-r--r-- | core/LocApiBase.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/core/LocApiBase.h b/core/LocApiBase.h index fc86eb3..b50a973 100644 --- a/core/LocApiBase.h +++ b/core/LocApiBase.h @@ -103,11 +103,11 @@ class LocApiBase { //it as a friend friend struct LocOpenMsg; friend struct LocCloseMsg; + friend struct LocKillMsg; friend class ContextBase; static MsgTask* mMsgTask; LocAdapterBase* mLocAdapters[MAX_ADAPTERS]; - protected: ContextBase *mContext; virtual enum loc_api_adapter_err @@ -118,7 +118,12 @@ protected: LOC_API_ADAPTER_EVENT_MASK_T mMask; LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask, ContextBase* context = NULL); - inline virtual ~LocApiBase() { close(); } + inline virtual ~LocApiBase() { + if (nullptr != mMsgTask) { + mMsgTask->destroy(); + mMsgTask = nullptr; + } + } bool isInSession(); const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask; bool isMaster(); @@ -127,6 +132,18 @@ public: inline void sendMsg(const LocMsg* msg) const { mMsgTask->sendMsg(msg); } + inline void destroy() { + close(); + struct LocKillMsg : public LocMsg { + LocApiBase* mLocApi; + inline LocKillMsg(LocApiBase* locApi) : LocMsg(), mLocApi(locApi) {} + inline virtual void proc() const { + delete mLocApi; + } + }; + sendMsg(new LocKillMsg(this)); + } + void addAdapter(LocAdapterBase* adapter); void removeAdapter(LocAdapterBase* adapter); |