diff --git a/frameworks/js/napi/src/ble/napi_bluetooth_ble_central_manager_callback.cpp b/frameworks/js/napi/src/ble/napi_bluetooth_ble_central_manager_callback.cpp index de944d279f5a79b8729fe2a72273596d24f58508..00be3a7e835bd57403e514e32b4b68926d170b60 100644 --- a/frameworks/js/napi/src/ble/napi_bluetooth_ble_central_manager_callback.cpp +++ b/frameworks/js/napi/src/ble/napi_bluetooth_ble_central_manager_callback.cpp @@ -113,6 +113,8 @@ void AfterWorkCallbackToSysBLEScan(uv_work_t *work, int status) napi_call_function(env, undefine, funcFail, ARGS_SIZE_TWO, callbackValue, &callbackResult); } napi_call_function(env, undefine, funcComplete, 0, nullptr, &callbackResult); + delete work; + work = nullptr; } void AfterWorkCallbackToSysBLEDeviceFound(uv_work_t *work, int status) @@ -139,6 +141,8 @@ void AfterWorkCallbackToSysBLEDeviceFound(uv_work_t *work, int status) napi_value funcSuccess = nullptr; napi_get_reference_value(env, data->callbackSuccess, &funcSuccess); napi_call_function(env, undefine, funcSuccess, ARGS_SIZE_ONE, &object, &callbackResult); + delete work; + work = nullptr; } void SysOnScanCallBack(sysBLEMap &observers, const BleScanResult &result) @@ -168,8 +172,14 @@ void SysOnScanCallBack(sysBLEMap &observers, const BleScanResult &result) data->callbackFail = callbackInfos[PARAM1]->callback_; data->result = std::make_shared(result); work->data = static_cast(data); - uv_queue_work( + int ret = uv_queue_work( loop, work, [](uv_work_t *work) {}, AfterWorkCallbackToSysBLEDeviceFound); + if (ret != 0) { + delete data; + data = nullptr; + delete work; + work = nullptr; + } } } // namespace @@ -311,16 +321,8 @@ void NapiBluetoothBleCentralManagerCallback::OnBleBatchScanResultsEvent(const st } } -void NapiBluetoothBleCentralManagerCallback::OnStartOrStopScanEvent(int resultCode, bool isStartScan) +static void StartBLESysScanTask(int resultCode) { - HILOGI("resultCode: %{public}d, isStartScan: %{public}d", resultCode, isStartScan); - auto napiIsStartScan = std::make_shared(isStartScan); - if (isStartScan) { - AsyncWorkCallFunction(asyncWorkMap_, NapiAsyncType::BLE_START_SCAN, napiIsStartScan, resultCode); - } else { - AsyncWorkCallFunction(asyncWorkMap_, NapiAsyncType::BLE_STOP_SCAN, napiIsStartScan, resultCode); - } - std::array, ARGS_SIZE_THREE> callbackInfos; { std::lock_guard lock(g_sysBLEObserverMutex); @@ -359,8 +361,27 @@ void NapiBluetoothBleCentralManagerCallback::OnStartOrStopScanEvent(int resultCo data->callbackFail = callbackInfos[PARAM1]->callback_; data->callbackComplete = callbackInfos[PARAM2]->callback_; work->data = static_cast(data); - uv_queue_work( + int ret = uv_queue_work( loop, work, [](uv_work_t *work) {}, AfterWorkCallbackToSysBLEScan); + if (ret != 0) { + delete data; + data = nullptr; + delete work; + work = nullptr; + } +} + +void NapiBluetoothBleCentralManagerCallback::OnStartOrStopScanEvent(int resultCode, bool isStartScan) +{ + HILOGI("resultCode: %{public}d, isStartScan: %{public}d", resultCode, isStartScan); + auto napiIsStartScan = std::make_shared(isStartScan); + if (isStartScan) { + AsyncWorkCallFunction(asyncWorkMap_, NapiAsyncType::BLE_START_SCAN, napiIsStartScan, resultCode); + } else { + AsyncWorkCallFunction(asyncWorkMap_, NapiAsyncType::BLE_STOP_SCAN, napiIsStartScan, resultCode); + } + + StartBLESysScanTask(resultCode); } napi_value NapiNativeBleScanResult::ToNapiValue(napi_env env) const diff --git a/frameworks/js/napi/src/common/napi_bluetooth_event.cpp b/frameworks/js/napi/src/common/napi_bluetooth_event.cpp index 80549006c758bf983ba2e373a497dcbccef66d43..51dfa52e0fab37a0e356f44f0cb7b832ed70a3f3 100644 --- a/frameworks/js/napi/src/common/napi_bluetooth_event.cpp +++ b/frameworks/js/napi/src/common/napi_bluetooth_event.cpp @@ -37,7 +37,7 @@ void NapiEvent::EventNotify(AsyncEventData *asyncEvent) } work->data = asyncEvent; - uv_queue_work( + int ret = uv_queue_work( loop, work, [](uv_work_t *work) {}, @@ -62,6 +62,12 @@ void NapiEvent::EventNotify(AsyncEventData *asyncEvent) work = nullptr; } ); + if (ret != 0) { + delete asyncEvent; + asyncEvent = nullptr; + delete work; + work = nullptr; + } } napi_value NapiEvent::CreateResult(const std::shared_ptr &cb, int value)