diff --git a/core/ContextBase.h b/core/ContextBase.h index 7c5ac175..4ad6cb16 100644 --- a/core/ContextBase.h +++ b/core/ContextBase.h @@ -124,7 +124,16 @@ public: ContextBase(const MsgTask* msgTask, LOC_API_ADAPTER_EVENT_MASK_T exMask, const char* libName); - inline virtual ~ContextBase() { delete mLocApi; delete mLBSProxy; } + inline virtual ~ContextBase() { + if (nullptr != mLocApi) { + mLocApi->destroy(); + mLocApi = nullptr; + } + if (nullptr != mLBSProxy) { + delete mLBSProxy; + mLBSProxy = nullptr; + } + } inline const MsgTask* getMsgTask() { return mMsgTask; } inline LocApiBase* getLocApi() { return mLocApi; } diff --git a/core/LocApiBase.h b/core/LocApiBase.h index fc86eb34..b50a973c 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);