Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e71a5f40 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Fix NPE of mAdvertiseCallbacksObj in JNI thread"

parents 6edf47dc 10613a5b
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -18,17 +18,18 @@

#define LOG_NDEBUG 0

#include "com_android_bluetooth.h"
#include "hardware/bt_gatt.h"
#include "utils/Log.h"

#include <base/bind.h>
#include <base/callback.h>
#include <cutils/log.h>
#include <string.h>

#include <array>
#include <memory>
#include <shared_mutex>

#include <cutils/log.h>
#include "com_android_bluetooth.h"
#include "hardware/bt_gatt.h"
#include "utils/Log.h"
#define info(fmt, ...) ALOGI("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
#define debug(fmt, ...) \
  ALOGD("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
@@ -193,6 +194,7 @@ static const btgatt_interface_t* sGattIf = NULL;
static jobject mCallbacksObj = NULL;
static jobject mAdvertiseCallbacksObj = NULL;
static jobject mPeriodicScanCallbacksObj = NULL;
static std::shared_mutex callbacks_mutex;

/**
 * BTA client callbacks
@@ -804,8 +806,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnAdvertisingSetStarted(int reg_id, uint8_t advertiser_id,
                               int8_t tx_power, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingSetStarted, reg_id,
                                 advertiser_id, tx_power, status);
@@ -813,24 +816,27 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                            uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingEnabled, advertiser_id,
                                 enable, status);
  }

  void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingDataSet, advertiser_id,
                                 status);
  }

  void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onScanResponseDataSet, advertiser_id,
                                 status);
@@ -838,8 +844,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power,
                                      uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingParametersUpdated,
                                 advertiser_id, tx_power, status);
@@ -847,16 +854,18 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id,
                                              uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingParametersUpdated,
                                 advertiser_id, status);
  }

  void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingDataSet,
                                 advertiser_id, status);
@@ -864,8 +873,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                                    uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingEnabled,
                                 advertiser_id, enable, status);
@@ -873,8 +883,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {

  void OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type,
                        RawAddress address) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;

    ScopedLocalRef<jstring> addr(sCallbackEnv.get(),
                                 bdaddr2newjstr(sCallbackEnv.get(), &address));
@@ -2000,6 +2011,7 @@ static void advertiseClassInitNative(JNIEnv* env, jclass clazz) {
}

static void advertiseInitializeNative(JNIEnv* env, jobject object) {
  std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
  if (mAdvertiseCallbacksObj != NULL) {
    ALOGW("Cleaning up Advertise callback object");
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
@@ -2010,6 +2022,7 @@ static void advertiseInitializeNative(JNIEnv* env, jobject object) {
}

static void advertiseCleanupNative(JNIEnv* env, jobject object) {
  std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
  if (mAdvertiseCallbacksObj != NULL) {
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
    mAdvertiseCallbacksObj = NULL;