Loading system/btif/src/stack_manager.cc +32 −30 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,6 @@ #include "main/shim/shim.h" #include "main/shim/shim.h" #include "osi/include/log.h" #include "osi/include/log.h" #include "osi/include/osi.h" #include "osi/include/osi.h" #include "osi/include/semaphore.h" #include "stack/include/acl_api.h" #include "stack/include/acl_api.h" #include "stack/include/btm_client_interface.h" #include "stack/include/btm_client_interface.h" #include "stack/include/btu.h" #include "stack/include/btu.h" Loading Loading @@ -135,7 +134,7 @@ static bool stack_is_initialized; // If running, the stack is fully up and able to bluetooth. // If running, the stack is fully up and able to bluetooth. static bool stack_is_running; static bool stack_is_running; static void event_init_stack(semaphore_t* semaphore, static void event_init_stack(std::promise<void> promise, bluetooth::core::CoreInterface* interface); bluetooth::core::CoreInterface* interface); static void event_start_up_stack(bluetooth::core::CoreInterface* interface, static void event_start_up_stack(bluetooth::core::CoreInterface* interface, ProfileStartCallback startProfiles, ProfileStartCallback startProfiles, Loading Loading @@ -165,12 +164,12 @@ static void init_stack(bluetooth::core::CoreInterface* interface) { // state modification only happens there. Using the thread to perform // state modification only happens there. Using the thread to perform // all stack operations ensures that the operations are done serially // all stack operations ensures that the operations are done serially // and do not overlap. // and do not overlap. semaphore_t* semaphore = semaphore_new(0); std::promise<void> promise; auto future = promise.get_future(); management_thread.DoInThread( management_thread.DoInThread( FROM_HERE, FROM_HERE, base::BindOnce(event_init_stack, std::move(promise), base::Bind(event_init_stack, semaphore, base::Unretained(interface))); base::Unretained(interface))); semaphore_wait(semaphore); future.wait(); semaphore_free(semaphore); } } static void start_up_stack_async(bluetooth::core::CoreInterface* interface, static void start_up_stack_async(bluetooth::core::CoreInterface* interface, Loading Loading @@ -249,14 +248,7 @@ inline const module_t* get_local_module(const char* name) { return nullptr; return nullptr; } } // Synchronous function to initialize the stack static void init_stack_internal(bluetooth::core::CoreInterface* interface) { static void event_init_stack(semaphore_t* semaphore, bluetooth::core::CoreInterface* interface) { LOG_INFO("is initializing the stack"); if (stack_is_initialized) { LOG_INFO("found the stack already in initialized state"); } else { // all callbacks out of libbluetooth-core happen via this interface // all callbacks out of libbluetooth-core happen via this interface interfaceToProfiles = interface; interfaceToProfiles = interface; Loading @@ -276,18 +268,28 @@ static void event_init_stack(semaphore_t* semaphore, stack_is_initialized = true; stack_is_initialized = true; } } // Synchronous function to initialize the stack static void event_init_stack(std::promise<void> promise, bluetooth::core::CoreInterface* interface) { LOG_INFO("is initializing the stack"); if (stack_is_initialized) { LOG_INFO("found the stack already in initialized state"); } else { init_stack_internal(interface); } LOG_INFO("finished"); LOG_INFO("finished"); if (semaphore) semaphore_post(semaphore); promise.set_value(); } } static void ensure_stack_is_initialized( static void ensure_stack_is_initialized( bluetooth::core::CoreInterface* interface) { bluetooth::core::CoreInterface* interface) { if (!stack_is_initialized) { if (!stack_is_initialized) { LOG_WARN("%s found the stack was uninitialized. Initializing now.", LOG_WARN("found the stack was uninitialized. Initializing now."); __func__); // No future needed since we are calling it directly // No semaphore needed since we are calling it directly init_stack_internal(interface); event_init_stack(nullptr, interface); } } } } Loading Loading
system/btif/src/stack_manager.cc +32 −30 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,6 @@ #include "main/shim/shim.h" #include "main/shim/shim.h" #include "osi/include/log.h" #include "osi/include/log.h" #include "osi/include/osi.h" #include "osi/include/osi.h" #include "osi/include/semaphore.h" #include "stack/include/acl_api.h" #include "stack/include/acl_api.h" #include "stack/include/btm_client_interface.h" #include "stack/include/btm_client_interface.h" #include "stack/include/btu.h" #include "stack/include/btu.h" Loading Loading @@ -135,7 +134,7 @@ static bool stack_is_initialized; // If running, the stack is fully up and able to bluetooth. // If running, the stack is fully up and able to bluetooth. static bool stack_is_running; static bool stack_is_running; static void event_init_stack(semaphore_t* semaphore, static void event_init_stack(std::promise<void> promise, bluetooth::core::CoreInterface* interface); bluetooth::core::CoreInterface* interface); static void event_start_up_stack(bluetooth::core::CoreInterface* interface, static void event_start_up_stack(bluetooth::core::CoreInterface* interface, ProfileStartCallback startProfiles, ProfileStartCallback startProfiles, Loading Loading @@ -165,12 +164,12 @@ static void init_stack(bluetooth::core::CoreInterface* interface) { // state modification only happens there. Using the thread to perform // state modification only happens there. Using the thread to perform // all stack operations ensures that the operations are done serially // all stack operations ensures that the operations are done serially // and do not overlap. // and do not overlap. semaphore_t* semaphore = semaphore_new(0); std::promise<void> promise; auto future = promise.get_future(); management_thread.DoInThread( management_thread.DoInThread( FROM_HERE, FROM_HERE, base::BindOnce(event_init_stack, std::move(promise), base::Bind(event_init_stack, semaphore, base::Unretained(interface))); base::Unretained(interface))); semaphore_wait(semaphore); future.wait(); semaphore_free(semaphore); } } static void start_up_stack_async(bluetooth::core::CoreInterface* interface, static void start_up_stack_async(bluetooth::core::CoreInterface* interface, Loading Loading @@ -249,14 +248,7 @@ inline const module_t* get_local_module(const char* name) { return nullptr; return nullptr; } } // Synchronous function to initialize the stack static void init_stack_internal(bluetooth::core::CoreInterface* interface) { static void event_init_stack(semaphore_t* semaphore, bluetooth::core::CoreInterface* interface) { LOG_INFO("is initializing the stack"); if (stack_is_initialized) { LOG_INFO("found the stack already in initialized state"); } else { // all callbacks out of libbluetooth-core happen via this interface // all callbacks out of libbluetooth-core happen via this interface interfaceToProfiles = interface; interfaceToProfiles = interface; Loading @@ -276,18 +268,28 @@ static void event_init_stack(semaphore_t* semaphore, stack_is_initialized = true; stack_is_initialized = true; } } // Synchronous function to initialize the stack static void event_init_stack(std::promise<void> promise, bluetooth::core::CoreInterface* interface) { LOG_INFO("is initializing the stack"); if (stack_is_initialized) { LOG_INFO("found the stack already in initialized state"); } else { init_stack_internal(interface); } LOG_INFO("finished"); LOG_INFO("finished"); if (semaphore) semaphore_post(semaphore); promise.set_value(); } } static void ensure_stack_is_initialized( static void ensure_stack_is_initialized( bluetooth::core::CoreInterface* interface) { bluetooth::core::CoreInterface* interface) { if (!stack_is_initialized) { if (!stack_is_initialized) { LOG_WARN("%s found the stack was uninitialized. Initializing now.", LOG_WARN("found the stack was uninitialized. Initializing now."); __func__); // No future needed since we are calling it directly // No semaphore needed since we are calling it directly init_stack_internal(interface); event_init_stack(nullptr, interface); } } } } Loading