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

Commit 631d25b4 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Thread switching simplification

* add jni_thread_wrapper
* add FROM_HERE parameter to do_in_jni_thread, this will be used in
later patches to make thread switching logs nice.

Bug: 30622771
Test: manual
Change-Id: I4c8f9e0f32c501a6126fe04f2476ab6453fe637e
parent 24c78c35
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@

#include <stdlib.h>

#include <base/bind.h>
#include <base/tracked_objects.h>
#include <hardware/bluetooth.h>

#include "bt_types.h"
@@ -202,6 +204,25 @@ typedef struct {
 *  Functions
 ******************************************************************************/

extern bt_status_t do_in_jni_thread(const base::Closure& task);
extern bt_status_t do_in_jni_thread(const tracked_objects::Location& from_here,
                                    const base::Closure& task);
/**
 * This template wraps callback into callback that will be executed on jni
 * thread
 */
template <typename R, typename... Args>
base::Callback<R(Args...)> jni_thread_wrapper(
    const tracked_objects::Location& from_here, base::Callback<R(Args...)> cb) {
  return base::Bind(
      [](const tracked_objects::Location& from_here,
         base::Callback<R(Args...)> cb, Args... args) {
        do_in_jni_thread(from_here,
                         base::Bind(cb, std::forward<Args>(args)...));
      },
      from_here, std::move(cb));
}

tBTA_SERVICE_MASK btif_get_enabled_services_mask(void);
bt_status_t btif_enable_service(tBTA_SERVICE_ID service_id);
bt_status_t btif_disable_service(tBTA_SERVICE_ID service_id);
+13 −33
Original line number Diff line number Diff line
@@ -120,26 +120,13 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
                               base::Unretained(this), cb)));
  }

  void SetDataCb(Callback cb, uint8_t advertiser_id, uint8_t status) {
    do_in_jni_thread(Bind(cb, status));
  }

  void SetData(int advertiser_id, bool set_scan_rsp, vector<uint8_t> data,
               Callback cb) override {
    do_in_bta_thread(FROM_HERE,
    do_in_bta_thread(
        FROM_HERE,
        Bind(&BleAdvertisingManager::SetData,
                          base::Unretained(BleAdvertisingManager::Get()),
                          advertiser_id, set_scan_rsp, std::move(data),
                          Bind(&BleAdvertiserInterfaceImpl::SetDataCb,
                               base::Unretained(this), cb, advertiser_id)));
  }

  void EnableTimeoutCb(Callback cb, uint8_t status) {
    do_in_jni_thread(Bind(cb, status));
  }

  void EnableCb(Callback cb, uint8_t status) {
    do_in_jni_thread(Bind(cb, status));
             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
             set_scan_rsp, std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
  }

  void Enable(uint8_t advertiser_id, bool enable, Callback cb, int timeout_s,
@@ -151,10 +138,8 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
        FROM_HERE,
        Bind(&BleAdvertisingManager::Enable,
             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
             enable, Bind(&BleAdvertiserInterfaceImpl::EnableCb,
                          base::Unretained(this), cb),
             timeout_s, Bind(&BleAdvertiserInterfaceImpl::EnableTimeoutCb,
                             base::Unretained(this), timeout_cb)));
             enable, jni_thread_wrapper(FROM_HERE, cb), timeout_s,
             jni_thread_wrapper(FROM_HERE, timeout_cb)));
  }

  void StartAdvertising(uint8_t advertiser_id, Callback cb,
@@ -178,17 +163,12 @@ class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
        params.scan_request_notification_enable;

    do_in_bta_thread(
        FROM_HERE, Bind(&BleAdvertisingManager::StartAdvertising,
                        base::Unretained(BleAdvertisingManager::Get()),
                        advertiser_id, base::Bind(
                                           [](Callback cb, uint8_t status) {
                                             do_in_jni_thread(Bind(cb, status));
                                           },
                                           cb),
                        base::Owned(p_params), std::move(advertise_data),
                        std::move(scan_response_data), timeout_s,
                        Bind(&BleAdvertiserInterfaceImpl::EnableTimeoutCb,
                             base::Unretained(this), timeout_cb)));
        FROM_HERE,
        Bind(&BleAdvertisingManager::StartAdvertising,
             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
             jni_thread_wrapper(FROM_HERE, cb), base::Owned(p_params),
             std::move(advertise_data), std::move(scan_response_data),
             timeout_s, jni_thread_wrapper(FROM_HERE, timeout_cb)));
  }
};

+11 −12
Original line number Diff line number Diff line
@@ -213,30 +213,29 @@ bt_status_t btif_transfer_context(tBTIF_CBACK* p_cback, uint16_t event,
  return BT_STATUS_SUCCESS;
}

/*******************************************************************************
 *
 * Function         do_in_jni_thread
 *
 * Description      This function posts a task into the btif message loop, that
 *                  executes it in the JNI message loop.
 *
 * Returns          void
 *
 ******************************************************************************/
bt_status_t do_in_jni_thread(const base::Closure& task) {
/**
 * This function posts a task into the btif message loop, that executes it in
 * the JNI message loop.
 **/
bt_status_t do_in_jni_thread(const tracked_objects::Location& from_here,
                             const base::Closure& task) {
  if (!message_loop_ || !message_loop_->task_runner().get()) {
    BTIF_TRACE_WARNING("%s: Dropped message, message_loop not initialized yet!",
                       __func__);
    return BT_STATUS_FAIL;
  }

  if (message_loop_->task_runner()->PostTask(FROM_HERE, task))
  if (message_loop_->task_runner()->PostTask(from_here, task))
    return BT_STATUS_SUCCESS;

  BTIF_TRACE_ERROR("%s: Post task to task runner failed!", __func__);
  return BT_STATUS_FAIL;
}

bt_status_t do_in_jni_thread(const base::Closure& task) {
  return do_in_jni_thread(FROM_HERE, task);
}

/*******************************************************************************
 *
 * Function         btif_is_dut_mode