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
This commit is contained in:
Kevin Tang 2018-07-23 16:24:00 -07:00
parent aa6481f638
commit a8f926020f
2 changed files with 29 additions and 3 deletions

View file

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

View file

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