mirror of
https://gitee.com/openharmony/base_location
synced 2024-11-27 09:00:27 +00:00
crash bugfix
Signed-off-by: ruan-shaofei <ruanshaofei2020@163.com>
This commit is contained in:
parent
f57ebd63aa
commit
9f7d62a520
@ -49,9 +49,9 @@ public:
|
||||
LBSLOGE(CACHED_LOCATIONS_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -90,8 +90,6 @@ private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
bool remoteDied_;
|
||||
std::mutex mutex_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -45,17 +45,15 @@ public:
|
||||
LBSLOGE(COUNTRY_CODE_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
std::mutex mutex_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -47,9 +47,9 @@ public:
|
||||
LBSLOGE(GNSS_STATUS_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -88,8 +88,6 @@ private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
bool remoteDied_;
|
||||
std::mutex mutex_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -54,9 +54,9 @@ public:
|
||||
LBSLOGE(LOCATING_DATA_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -107,12 +107,10 @@ public:
|
||||
fixNumber_ = fixNumber;
|
||||
}
|
||||
private:
|
||||
bool callbackValid_;
|
||||
int fixNumber_;
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
bool remoteDied_;
|
||||
std::mutex mutex_;
|
||||
std::mutex singleResultMutex_;
|
||||
CountDownLatch* latch_;
|
||||
std::vector<std::shared_ptr<LocatingRequiredData>> singleResult_;
|
||||
|
@ -47,9 +47,9 @@ public:
|
||||
LBSLOGE(LOCATION_ERR_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -77,8 +77,6 @@ public:
|
||||
private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
std::mutex mutex_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -46,9 +46,9 @@ public:
|
||||
LBSLOGE(SWITCH_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -87,8 +87,6 @@ private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
bool remoteDied_;
|
||||
std::mutex mutex_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -61,13 +61,16 @@ public:
|
||||
return false;
|
||||
}
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
if (IsSystemGeoLocationApi()) {
|
||||
napi_reference_ref(env_, successHandlerCb_, &refCount);
|
||||
napi_reference_ref(env_, failHandlerCb_, &refCount);
|
||||
napi_reference_ref(env_, completeHandlerCb_, &refCount);
|
||||
context->callback[SUCCESS_CALLBACK] = successHandlerCb_;
|
||||
context->callback[FAIL_CALLBACK] = failHandlerCb_;
|
||||
context->callback[COMPLETE_CALLBACK] = completeHandlerCb_;
|
||||
} else {
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
}
|
||||
return true;
|
||||
@ -145,7 +148,7 @@ public:
|
||||
|
||||
inline std::shared_ptr<Location> GetSingleLocation()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(locationMutex_);
|
||||
return singleLocation_;
|
||||
}
|
||||
bool NeedSetSingleLocation(const std::unique_ptr<Location>& location);
|
||||
@ -159,12 +162,11 @@ private:
|
||||
napi_ref failHandlerCb_;
|
||||
napi_ref completeHandlerCb_;
|
||||
int fixNumber_;
|
||||
std::mutex mutex_;
|
||||
std::mutex locationMutex_;
|
||||
CountDownLatch* latch_;
|
||||
std::shared_ptr<Location> singleLocation_;
|
||||
int locationPriority_;
|
||||
bool inHdArea_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -49,9 +49,9 @@ public:
|
||||
LBSLOGE(NMEA_MESSAGE_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -90,8 +90,6 @@ private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
bool remoteDied_;
|
||||
std::mutex mutex_;
|
||||
bool callbackValid_;
|
||||
};
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -23,12 +23,12 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
CachedLocationsCallbackNapi::CachedLocationsCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
handlerCb_ = nullptr;
|
||||
remoteDied_ = false;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
CachedLocationsCallbackNapi::~CachedLocationsCallbackNapi()
|
||||
@ -75,7 +75,7 @@ bool CachedLocationsCallbackNapi::IsRemoteDied()
|
||||
|
||||
bool CachedLocationsCallbackNapi::Send(std::vector<std::unique_ptr<Location>>& locations)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_BASE(env_, napi_get_uv_event_loop(env_, &loop), false);
|
||||
if (loop == nullptr) {
|
||||
@ -123,7 +123,7 @@ void CachedLocationsCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<CachedLocationAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(CACHED_LOCATIONS_CALLBACK, "context is nullptr");
|
||||
delete work;
|
||||
return;
|
||||
@ -135,11 +135,12 @@ void CachedLocationsCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_create_object(context->env, &jsEvent),
|
||||
scope, context, work);
|
||||
LocationsToJs(context->env, context->locationList, jsEvent);
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -152,6 +153,11 @@ void CachedLocationsCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -164,14 +170,17 @@ void CachedLocationsCallbackNapi::OnCacheLocationsReport(const std::vector<std::
|
||||
|
||||
void CachedLocationsCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(CACHED_LOCATIONS_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -24,11 +24,11 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
CountryCodeCallbackNapi::CountryCodeCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
CountryCodeCallbackNapi::~CountryCodeCallbackNapi()
|
||||
@ -60,7 +60,7 @@ int CountryCodeCallbackNapi::OnRemoteRequest(
|
||||
|
||||
bool CountryCodeCallbackNapi::Send(const std::shared_ptr<CountryCode>& country)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
if (env_ == nullptr) {
|
||||
LBSLOGE(COUNTRY_CODE_CALLBACK, "env_ == nullptr.");
|
||||
@ -114,7 +114,7 @@ void CountryCodeCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<CountryCodeContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "context is nullptr!");
|
||||
delete work;
|
||||
return;
|
||||
@ -126,6 +126,7 @@ void CountryCodeCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_create_object(context->env, &jsEvent),
|
||||
scope, context, work);
|
||||
@ -134,7 +135,7 @@ void CountryCodeCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
} else {
|
||||
LBSLOGE(LOCATOR_STANDARD, "country is nullptr!");
|
||||
}
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env,
|
||||
@ -147,6 +148,11 @@ void CountryCodeCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -160,26 +166,29 @@ void CountryCodeCallbackNapi::OnCountryCodeChange(const std::shared_ptr<CountryC
|
||||
|
||||
void CountryCodeCallbackNapi::SetEnv(napi_env env)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
env_ = env;
|
||||
}
|
||||
|
||||
void CountryCodeCallbackNapi::SetCallback(napi_ref cb)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
handlerCb_ = cb;
|
||||
}
|
||||
|
||||
void CountryCodeCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(COUNTRY_CODE_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -25,12 +25,12 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
GnssStatusCallbackNapi::GnssStatusCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
handlerCb_ = nullptr;
|
||||
remoteDied_ = false;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
GnssStatusCallbackNapi::~GnssStatusCallbackNapi()
|
||||
@ -71,7 +71,7 @@ bool GnssStatusCallbackNapi::IsRemoteDied()
|
||||
|
||||
bool GnssStatusCallbackNapi::Send(std::unique_ptr<SatelliteStatus>& statusInfo)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_BASE(env_, napi_get_uv_event_loop(env_, &loop), false);
|
||||
if (loop == nullptr) {
|
||||
@ -117,7 +117,7 @@ void GnssStatusCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<GnssStatusAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "context is nullptr!");
|
||||
delete work;
|
||||
return;
|
||||
@ -129,25 +129,30 @@ void GnssStatusCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent = nullptr;
|
||||
if (context->statusInfo != nullptr) {
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_create_object(context->env, &jsEvent),
|
||||
scope, context, work);
|
||||
SatelliteStatusToJs(context->env, context->statusInfo, jsEvent);
|
||||
}
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
scope, context, work);
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env,
|
||||
napi_get_reference_value(context->env, context->callback[0], &handler), scope, context, work);
|
||||
if (napi_call_function(context->env, nullptr, handler, 1,
|
||||
&jsEvent, &undefine) != napi_ok) {
|
||||
if (napi_call_function(context->env, nullptr, handler, 1, &jsEvent, &undefine) != napi_ok) {
|
||||
LBSLOGE(GNSS_STATUS_CALLBACK, "Report event failed");
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -160,14 +165,17 @@ void GnssStatusCallbackNapi::OnStatusChange(const std::unique_ptr<SatelliteStatu
|
||||
|
||||
void GnssStatusCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(GNSS_STATUS_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
LocatingRequiredDataCallbackNapi::LocatingRequiredDataCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
@ -30,7 +31,6 @@ LocatingRequiredDataCallbackNapi::LocatingRequiredDataCallbackNapi()
|
||||
remoteDied_ = false;
|
||||
fixNumber_ = 0;
|
||||
InitLatch();
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
LocatingRequiredDataCallbackNapi::~LocatingRequiredDataCallbackNapi()
|
||||
@ -95,7 +95,7 @@ bool LocatingRequiredDataCallbackNapi::Send(const std::vector<std::shared_ptr<Lo
|
||||
if (IsSingleLocationRequest()) {
|
||||
return false;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_BASE(env_, napi_get_uv_event_loop(env_, &loop), false);
|
||||
if (loop == nullptr) {
|
||||
@ -141,7 +141,7 @@ void LocatingRequiredDataCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
return;
|
||||
}
|
||||
context = static_cast<LocatingRequiredDataAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATING_DATA_CALLBACK, "context is nullptr");
|
||||
delete work;
|
||||
return;
|
||||
@ -153,12 +153,13 @@ void LocatingRequiredDataCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env,
|
||||
napi_create_array_with_length(context->env, context->locatingRequiredDataList_.size(), &jsEvent),
|
||||
scope, context, work);
|
||||
LocatingRequiredDataToJsObj(context->env, context->locatingRequiredDataList_, jsEvent);
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -171,6 +172,11 @@ void LocatingRequiredDataCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -185,14 +191,17 @@ void LocatingRequiredDataCallbackNapi::OnLocatingDataChange(
|
||||
|
||||
void LocatingRequiredDataCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(LOCATING_DATA_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
bool LocatingRequiredDataCallbackNapi::IsSingleLocationRequest()
|
||||
|
@ -23,11 +23,11 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
LocationErrorCallbackNapi::LocationErrorCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
LocationErrorCallbackNapi::~LocationErrorCallbackNapi()
|
||||
@ -59,7 +59,7 @@ int LocationErrorCallbackNapi::OnRemoteRequest(
|
||||
bool LocationErrorCallbackNapi::Send(int32_t errorCode)
|
||||
{
|
||||
LBSLOGI(LOCATION_ERR_CALLBACK, "LocatorCallbackNapi::OnRemoteRequest! errorCode = %{public}d", errorCode);
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_BASE(env_, napi_get_uv_event_loop(env_, &loop), false);
|
||||
if (loop == nullptr) {
|
||||
@ -105,7 +105,7 @@ void LocationErrorCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<LocationErrorAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATION_ERR_CALLBACK, "context is nullptr!");
|
||||
delete work;
|
||||
return;
|
||||
@ -120,7 +120,8 @@ void LocationErrorCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -133,6 +134,11 @@ void LocationErrorCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -154,14 +160,17 @@ void LocationErrorCallbackNapi::OnErrorReport(const int errorCode)
|
||||
|
||||
void LocationErrorCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(LOCATION_ERR_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
LocationGnssGeofenceCallbackNapi::LocationGnssGeofenceCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
@ -34,7 +35,6 @@ LocationGnssGeofenceCallbackNapi::LocationGnssGeofenceCallbackNapi()
|
||||
fenceId_ = -1;
|
||||
type_ = GNSS_GEOFENCE_OPT_TYPE_ADD;
|
||||
result_ = GNSS_GEOFENCE_OPERATION_SUCCESS;
|
||||
callbackValid_ = false;
|
||||
InitLatch();
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ int LocationGnssGeofenceCallbackNapi::OnRemoteRequest(
|
||||
void LocationGnssGeofenceCallbackNapi::OnTransitionStatusChange(
|
||||
GeofenceTransition transition)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_get_uv_event_loop(env_, &loop));
|
||||
if (loop == nullptr) {
|
||||
@ -155,7 +155,7 @@ void LocationGnssGeofenceCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
return;
|
||||
}
|
||||
context = static_cast<GnssGeofenceAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATION_GNSS_GEOFENCE_CALLBACK, "context is nullptr");
|
||||
delete work;
|
||||
return;
|
||||
@ -167,13 +167,14 @@ void LocationGnssGeofenceCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent[PARAM2];
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_create_object(context->env, &jsEvent[PARAM1]),
|
||||
scope, context, work);
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &jsEvent[PARAM0]),
|
||||
scope, context, work);
|
||||
GeofenceTransitionToJs(context->env, context->transition_, jsEvent[PARAM1]);
|
||||
if (context->callback[SUCCESS_CALLBACK] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[SUCCESS_CALLBACK] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -187,6 +188,11 @@ void LocationGnssGeofenceCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -194,14 +200,17 @@ void LocationGnssGeofenceCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* w
|
||||
|
||||
void LocationGnssGeofenceCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(LOCATION_GNSS_GEOFENCE_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
void LocationGnssGeofenceCallbackNapi::CountDown()
|
||||
|
@ -20,12 +20,12 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
LocationSwitchCallbackNapi::LocationSwitchCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
handlerCb_ = nullptr;
|
||||
remoteDied_ = false;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
LocationSwitchCallbackNapi::~LocationSwitchCallbackNapi()
|
||||
@ -72,7 +72,7 @@ napi_value LocationSwitchCallbackNapi::PackResult(bool switchState)
|
||||
|
||||
bool LocationSwitchCallbackNapi::Send(int switchState)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_BASE(env_, napi_get_uv_event_loop(env_, &loop), false);
|
||||
if (loop == nullptr) {
|
||||
@ -118,7 +118,7 @@ void LocationSwitchCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<SwitchAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "context is nullptr!");
|
||||
delete work;
|
||||
return;
|
||||
@ -133,7 +133,8 @@ void LocationSwitchCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -146,6 +147,11 @@ void LocationSwitchCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -159,14 +165,17 @@ void LocationSwitchCallbackNapi::OnSwitchChange(int switchState)
|
||||
|
||||
void LocationSwitchCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(SWITCH_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -33,6 +33,7 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
LocatorCallbackNapi::LocatorCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
@ -43,7 +44,6 @@ LocatorCallbackNapi::LocatorCallbackNapi()
|
||||
fixNumber_ = 0;
|
||||
inHdArea_ = true;
|
||||
singleLocation_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
locationPriority_ = 0;
|
||||
InitLatch();
|
||||
}
|
||||
@ -121,7 +121,7 @@ void LocatorCallbackNapi::DoSendWork(uv_loop_s*& loop, uv_work_t*& work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
if (context->env == nullptr || context->loc == nullptr || context->callbackValid == nullptr) {
|
||||
if (context->env == nullptr || context->loc == nullptr) {
|
||||
delete context;
|
||||
delete work;
|
||||
return;
|
||||
@ -131,6 +131,7 @@ void LocatorCallbackNapi::DoSendWork(uv_loop_s*& loop, uv_work_t*& work)
|
||||
DELETE_SCOPE_CONTEXT_WORK(context->env, scope, context, work);
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_create_object(context->env, &jsEvent), scope, context, work);
|
||||
if (context->callback[1]) {
|
||||
@ -138,7 +139,7 @@ void LocatorCallbackNapi::DoSendWork(uv_loop_s*& loop, uv_work_t*& work)
|
||||
} else {
|
||||
LocationToJs(context->env, context->loc, jsEvent);
|
||||
}
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine = nullptr;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -149,7 +150,14 @@ void LocatorCallbackNapi::DoSendWork(uv_loop_s*& loop, uv_work_t*& work)
|
||||
LBSLOGE(LOCATOR_CALLBACK, "Report location failed");
|
||||
}
|
||||
}
|
||||
DELETE_SCOPE_CONTEXT_WORK(context->env, scope, context, work);
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
}
|
||||
|
||||
@ -164,7 +172,7 @@ void LocatorCallbackNapi::DoSendErrorCode(uv_loop_s *&loop, uv_work_t *&work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<AsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "context is nullptr");
|
||||
delete work;
|
||||
return;
|
||||
@ -176,7 +184,8 @@ void LocatorCallbackNapi::DoSendErrorCode(uv_loop_s *&loop, uv_work_t *&work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
if (context->callback[FAIL_CALLBACK] != nullptr && *(context->callbackValid)) {
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (context->callback[FAIL_CALLBACK] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -192,6 +201,12 @@ void LocatorCallbackNapi::DoSendErrorCode(uv_loop_s *&loop, uv_work_t *&work)
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[FAIL_CALLBACK], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env,
|
||||
napi_delete_reference(context->env, context->callback[FAIL_CALLBACK]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -199,7 +214,7 @@ void LocatorCallbackNapi::DoSendErrorCode(uv_loop_s *&loop, uv_work_t *&work)
|
||||
|
||||
bool LocatorCallbackNapi::SendErrorCode(const int& errorCode)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (!IsSystemGeoLocationApi() && !IsSingleLocationRequest()) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "this is Callback type,cant send error msg.");
|
||||
return false;
|
||||
@ -240,7 +255,7 @@ bool LocatorCallbackNapi::SendErrorCode(const int& errorCode)
|
||||
|
||||
void LocatorCallbackNapi::OnLocationReport(const std::unique_ptr<Location>& location)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
if (env_ == nullptr) {
|
||||
LBSLOGD(LOCATOR_CALLBACK, "env_ is nullptr.");
|
||||
@ -291,31 +306,35 @@ void LocatorCallbackNapi::DeleteAllCallbacks()
|
||||
void LocatorCallbackNapi::DeleteHandler()
|
||||
{
|
||||
LBSLOGD(LOCATOR_CALLBACK, "before DeleteHandler");
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (env_ == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "env is nullptr.");
|
||||
return;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
if (IsSystemGeoLocationApi()) {
|
||||
if (successHandlerCb_ != nullptr) {
|
||||
napi_reference_unref(env_, successHandlerCb_, &refCount);
|
||||
if (successHandlerCb_ != nullptr && refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, successHandlerCb_));
|
||||
successHandlerCb_ = nullptr;
|
||||
}
|
||||
if (failHandlerCb_ != nullptr) {
|
||||
napi_reference_unref(env_, failHandlerCb_, &refCount);
|
||||
if (failHandlerCb_ != nullptr && refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, failHandlerCb_));
|
||||
failHandlerCb_ = nullptr;
|
||||
}
|
||||
if (completeHandlerCb_ != nullptr) {
|
||||
napi_reference_unref(env_, completeHandlerCb_, &refCount);
|
||||
if (completeHandlerCb_ != nullptr && refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, completeHandlerCb_));
|
||||
completeHandlerCb_ = nullptr;
|
||||
}
|
||||
} else {
|
||||
if (handlerCb_ != nullptr) {
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (handlerCb_ != nullptr && refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
handlerCb_ = nullptr;
|
||||
}
|
||||
}
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
bool LocatorCallbackNapi::IsSystemGeoLocationApi()
|
||||
@ -382,7 +401,7 @@ bool LocatorCallbackNapi::IfReportAccuracyLocation()
|
||||
|
||||
void LocatorCallbackNapi::SetSingleLocation(const std::unique_ptr<Location>& location)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(locationMutex_);
|
||||
singleLocation_ = std::make_shared<Location>(*location);
|
||||
}
|
||||
} // namespace Location
|
||||
|
@ -1037,7 +1037,7 @@ void DeleteCallbackHandler(uv_loop_s *&loop, uv_work_t *&work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<AsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "context is nullptr");
|
||||
delete work;
|
||||
return;
|
||||
@ -1049,13 +1049,6 @@ void DeleteCallbackHandler(uv_loop_s *&loop, uv_work_t *&work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
if (*(context->callbackValid) == false) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "callbackValid is false");
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
delete context;
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
if (context->callback[SUCCESS_CALLBACK] != nullptr) {
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env,
|
||||
napi_delete_reference(context->env, context->callback[SUCCESS_CALLBACK]),
|
||||
@ -1071,7 +1064,6 @@ void DeleteCallbackHandler(uv_loop_s *&loop, uv_work_t *&work)
|
||||
napi_delete_reference(context->env, context->callback[COMPLETE_CALLBACK]),
|
||||
scope, context, work);
|
||||
}
|
||||
*(context->callbackValid) = false;
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
delete context;
|
||||
delete work;
|
||||
|
@ -24,12 +24,12 @@
|
||||
|
||||
namespace OHOS {
|
||||
namespace Location {
|
||||
static std::mutex g_mutex;
|
||||
NmeaMessageCallbackNapi::NmeaMessageCallbackNapi()
|
||||
{
|
||||
env_ = nullptr;
|
||||
handlerCb_ = nullptr;
|
||||
remoteDied_ = false;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
|
||||
NmeaMessageCallbackNapi::~NmeaMessageCallbackNapi()
|
||||
@ -78,7 +78,7 @@ napi_value NmeaMessageCallbackNapi::PackResult(const std::string msg)
|
||||
|
||||
bool NmeaMessageCallbackNapi::Send(const std::string msg)
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
uv_loop_s *loop = nullptr;
|
||||
NAPI_CALL_BASE(env_, napi_get_uv_event_loop(env_, &loop), false);
|
||||
if (loop == nullptr) {
|
||||
@ -125,7 +125,7 @@ void NmeaMessageCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
return;
|
||||
}
|
||||
context = static_cast<NmeaAsyncContext *>(work->data);
|
||||
if (context == nullptr || context->env == nullptr || context->callbackValid == nullptr) {
|
||||
if (context == nullptr || context->env == nullptr) {
|
||||
LBSLOGE(LOCATOR_CALLBACK, "context is nullptr!");
|
||||
delete work;
|
||||
return;
|
||||
@ -137,11 +137,12 @@ void NmeaMessageCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
delete work;
|
||||
return;
|
||||
}
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
napi_value jsEvent;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env,
|
||||
napi_create_string_utf8(context->env, context->msg.c_str(), NAPI_AUTO_LENGTH, &jsEvent),
|
||||
scope, context, work);
|
||||
if (context->callback[0] != nullptr && *(context->callbackValid)) {
|
||||
if (context->callback[0] != nullptr) {
|
||||
napi_value undefine;
|
||||
napi_value handler = nullptr;
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env, napi_get_undefined(context->env, &undefine),
|
||||
@ -149,12 +150,16 @@ void NmeaMessageCallbackNapi::UvQueueWork(uv_loop_s* loop, uv_work_t* work)
|
||||
CHK_NAPI_ERR_CLOSE_SCOPE(context->env,
|
||||
napi_get_reference_value(context->env, context->callback[0], &handler),
|
||||
scope, context, work);
|
||||
if (napi_call_function(context->env, nullptr, handler, 1,
|
||||
&jsEvent, &undefine) != napi_ok) {
|
||||
if (napi_call_function(context->env, nullptr, handler, 1, &jsEvent, &undefine) != napi_ok) {
|
||||
LBSLOGE(NMEA_MESSAGE_CALLBACK, "Report event failed");
|
||||
}
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_close_handle_scope(context->env, scope));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(context->env, context->callback[0], &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(context->env, napi_delete_reference(context->env, context->callback[0]));
|
||||
}
|
||||
delete context;
|
||||
delete work;
|
||||
});
|
||||
@ -168,14 +173,17 @@ void NmeaMessageCallbackNapi::OnMessageChange(int64_t timestamp, const std::stri
|
||||
|
||||
void NmeaMessageCallbackNapi::DeleteHandler()
|
||||
{
|
||||
std::unique_lock<std::mutex> guard(mutex_);
|
||||
std::unique_lock<std::mutex> guard(g_mutex);
|
||||
if (handlerCb_ == nullptr || env_ == nullptr) {
|
||||
LBSLOGE(NMEA_MESSAGE_CALLBACK, "handler or env is nullptr.");
|
||||
return;
|
||||
}
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_unref(env_, handlerCb_, &refCount);
|
||||
if (refCount == 0) {
|
||||
NAPI_CALL_RETURN_VOID(env_, napi_delete_reference(env_, handlerCb_));
|
||||
}
|
||||
handlerCb_ = nullptr;
|
||||
callbackValid_ = false;
|
||||
}
|
||||
} // namespace Location
|
||||
} // namespace OHOS
|
||||
|
@ -27,7 +27,6 @@ public:
|
||||
napi_async_work work;
|
||||
napi_deferred deferred;
|
||||
napi_ref callback[MAX_CALLBACK_NUM] = { 0 };
|
||||
bool* callbackValid;
|
||||
std::function<void(void*)> executeFunc;
|
||||
std::function<void(void*)> completeFunc;
|
||||
napi_value resourceName;
|
||||
@ -44,7 +43,6 @@ public:
|
||||
resourceName = nullptr;
|
||||
result[PARAM0] = nullptr;
|
||||
result[PARAM1] = nullptr;
|
||||
callbackValid = nullptr;
|
||||
errCode = 0;
|
||||
}
|
||||
|
||||
|
@ -47,6 +47,7 @@ const int32_t UNKNOW_USER_ID = -1;
|
||||
const int32_t SUBSCRIBE_TIME = 5;
|
||||
const int32_t DEFAULT_TIME_INTERVAL = 30 * 60; // app receive location every 30 minutes in frozen state
|
||||
const int32_t REQUESTS_NUM_MAX = 1;
|
||||
constexpr uint32_t INVALID_REF_COUNT = 0xFF;
|
||||
constexpr const char* FEATURE_SWITCH_PROP = "ro.config.locator_background";
|
||||
constexpr const char* TIME_INTERVAL_PROP = "ro.config.locator_background.timeInterval";
|
||||
constexpr const char* PROC_NAME = "system";
|
||||
|
@ -57,9 +57,9 @@ public:
|
||||
LBSLOGE(LOCATION_GNSS_GEOFENCE_CALLBACK, "context == nullptr.");
|
||||
return false;
|
||||
}
|
||||
uint32_t refCount = INVALID_REF_COUNT;
|
||||
napi_reference_ref(env_, handlerCb_, &refCount);
|
||||
context->env = env_;
|
||||
callbackValid_ = handlerCb_ == nullptr ? false : true;
|
||||
context->callbackValid = &callbackValid_;
|
||||
context->callback[SUCCESS_CALLBACK] = handlerCb_;
|
||||
return true;
|
||||
}
|
||||
@ -101,11 +101,9 @@ private:
|
||||
napi_env env_;
|
||||
napi_ref handlerCb_;
|
||||
bool remoteDied_;
|
||||
std::mutex mutex_;
|
||||
std::mutex operationResultMutex_;
|
||||
CountDownLatch* latch_;
|
||||
int fenceId_;
|
||||
bool callbackValid_;
|
||||
GnssGeofenceOperateType type_;
|
||||
GnssGeofenceOperateResult result_;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user