Loading system/gd/l2cap/classic/internal/link.h +1 −1 Original line number Diff line number Diff line Loading @@ -170,9 +170,9 @@ class Link : public l2cap::internal::ILink, public hci::ConnectionManagementCall l2cap::internal::ParameterProvider* parameter_provider_; DynamicChannelServiceManagerImpl* dynamic_service_manager_; FixedChannelServiceManagerImpl* fixed_service_manager_; ClassicSignallingManager signalling_manager_; std::unordered_map<Cid, PendingDynamicChannelConnection> local_cid_to_pending_dynamic_channel_connection_map_; os::Alarm link_idle_disconnect_alarm_{l2cap_handler_}; ClassicSignallingManager signalling_manager_; Mtu remote_connectionless_mtu_ = kMinimumClassicMtu; bool remote_supports_ertm_ = false; bool remote_supports_fcs_ = false; Loading system/gd/l2cap/internal/data_pipeline_manager.h +1 −1 Original line number Diff line number Diff line Loading @@ -71,9 +71,9 @@ class DataPipelineManager { private: os::Handler* handler_; ILink* link_; std::unordered_map<Cid, Sender> sender_map_; std::unique_ptr<Scheduler> scheduler_; Receiver receiver_; std::unordered_map<Cid, Sender> sender_map_; }; } // namespace internal } // namespace l2cap Loading system/gd/l2cap/internal/scheduler_fifo.cc +6 −7 Original line number Diff line number Diff line Loading @@ -30,12 +30,12 @@ Fifo::Fifo(DataPipelineManager* data_pipeline_manager, LowerQueueUpEnd* link_que ASSERT(link_queue_up_end_ != nullptr && handler_ != nullptr); } // Invoked from some external Handler context Fifo::~Fifo() { if (link_queue_enqueue_registered_) { link_queue_up_end_->UnregisterEnqueue(); } // TODO(hsz): notify Sender don't send callback to me } // Invoked within L2CAP Handler context void Fifo::OnPacketsReady(Cid cid, int number_packets) { if (number_packets == 0) { return; Loading @@ -44,6 +44,7 @@ void Fifo::OnPacketsReady(Cid cid, int number_packets) { try_register_link_queue_enqueue(); } // Invoked from some external Queue Reactable context std::unique_ptr<Fifo::UpperDequeue> Fifo::link_queue_enqueue_callback() { ASSERT(!next_to_dequeue_and_num_packets.empty()); auto& channel_id_and_number_packets = next_to_dequeue_and_num_packets.front(); Loading @@ -55,20 +56,18 @@ std::unique_ptr<Fifo::UpperDequeue> Fifo::link_queue_enqueue_callback() { auto packet = data_pipeline_manager_->GetDataController(channel_id)->GetNextPacket(); data_pipeline_manager_->OnPacketSent(channel_id); if (next_to_dequeue_and_num_packets.empty()) { if (next_to_dequeue_and_num_packets.empty() && link_queue_enqueue_registered_.exchange(false)) { link_queue_up_end_->UnregisterEnqueue(); link_queue_enqueue_registered_ = false; } return packet; } void Fifo::try_register_link_queue_enqueue() { if (link_queue_enqueue_registered_) { if (link_queue_enqueue_registered_.exchange(true)) { return; } link_queue_up_end_->RegisterEnqueue(handler_, common::Bind(&Fifo::link_queue_enqueue_callback, common::Unretained(this))); link_queue_enqueue_registered_ = true; } } // namespace internal Loading system/gd/l2cap/internal/scheduler_fifo.h +2 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include <atomic> #include <string> #include <unordered_map> Loading Loading @@ -44,7 +45,7 @@ class Fifo : public Scheduler { LowerQueueUpEnd* link_queue_up_end_; os::Handler* handler_; std::queue<std::pair<Cid, int>> next_to_dequeue_and_num_packets; bool link_queue_enqueue_registered_ = false; std::atomic_bool link_queue_enqueue_registered_ = false; void try_register_link_queue_enqueue(); std::unique_ptr<LowerEnqueue> link_queue_enqueue_callback(); Loading system/gd/l2cap/internal/sender.cc +8 −6 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ Sender::Sender(os::Handler* handler, ILink* link, Scheduler* scheduler, std::sha } Sender::~Sender() { if (is_dequeue_registered_) { if (is_dequeue_registered_.exchange(false)) { queue_end_->UnregisterDequeue(); } } Loading @@ -73,19 +73,21 @@ DataController* Sender::GetDataController() { } void Sender::try_register_dequeue() { if (is_dequeue_registered_) { if (is_dequeue_registered_.exchange(true)) { return; } queue_end_->RegisterDequeue(handler_, common::Bind(&Sender::dequeue_callback, common::Unretained(this))); is_dequeue_registered_ = true; } // From external context void Sender::dequeue_callback() { auto packet = queue_end_->TryDequeue(); ASSERT(packet != nullptr); data_controller_->OnSdu(std::move(packet)); handler_->Post( common::BindOnce(&DataController::OnSdu, common::Unretained(data_controller_.get()), std::move(packet))); if (is_dequeue_registered_.exchange(false)) { queue_end_->UnregisterDequeue(); is_dequeue_registered_ = false; } } void Sender::UpdateClassicConfiguration(classic::internal::ChannelConfigurationState config) { Loading Loading
system/gd/l2cap/classic/internal/link.h +1 −1 Original line number Diff line number Diff line Loading @@ -170,9 +170,9 @@ class Link : public l2cap::internal::ILink, public hci::ConnectionManagementCall l2cap::internal::ParameterProvider* parameter_provider_; DynamicChannelServiceManagerImpl* dynamic_service_manager_; FixedChannelServiceManagerImpl* fixed_service_manager_; ClassicSignallingManager signalling_manager_; std::unordered_map<Cid, PendingDynamicChannelConnection> local_cid_to_pending_dynamic_channel_connection_map_; os::Alarm link_idle_disconnect_alarm_{l2cap_handler_}; ClassicSignallingManager signalling_manager_; Mtu remote_connectionless_mtu_ = kMinimumClassicMtu; bool remote_supports_ertm_ = false; bool remote_supports_fcs_ = false; Loading
system/gd/l2cap/internal/data_pipeline_manager.h +1 −1 Original line number Diff line number Diff line Loading @@ -71,9 +71,9 @@ class DataPipelineManager { private: os::Handler* handler_; ILink* link_; std::unordered_map<Cid, Sender> sender_map_; std::unique_ptr<Scheduler> scheduler_; Receiver receiver_; std::unordered_map<Cid, Sender> sender_map_; }; } // namespace internal } // namespace l2cap Loading
system/gd/l2cap/internal/scheduler_fifo.cc +6 −7 Original line number Diff line number Diff line Loading @@ -30,12 +30,12 @@ Fifo::Fifo(DataPipelineManager* data_pipeline_manager, LowerQueueUpEnd* link_que ASSERT(link_queue_up_end_ != nullptr && handler_ != nullptr); } // Invoked from some external Handler context Fifo::~Fifo() { if (link_queue_enqueue_registered_) { link_queue_up_end_->UnregisterEnqueue(); } // TODO(hsz): notify Sender don't send callback to me } // Invoked within L2CAP Handler context void Fifo::OnPacketsReady(Cid cid, int number_packets) { if (number_packets == 0) { return; Loading @@ -44,6 +44,7 @@ void Fifo::OnPacketsReady(Cid cid, int number_packets) { try_register_link_queue_enqueue(); } // Invoked from some external Queue Reactable context std::unique_ptr<Fifo::UpperDequeue> Fifo::link_queue_enqueue_callback() { ASSERT(!next_to_dequeue_and_num_packets.empty()); auto& channel_id_and_number_packets = next_to_dequeue_and_num_packets.front(); Loading @@ -55,20 +56,18 @@ std::unique_ptr<Fifo::UpperDequeue> Fifo::link_queue_enqueue_callback() { auto packet = data_pipeline_manager_->GetDataController(channel_id)->GetNextPacket(); data_pipeline_manager_->OnPacketSent(channel_id); if (next_to_dequeue_and_num_packets.empty()) { if (next_to_dequeue_and_num_packets.empty() && link_queue_enqueue_registered_.exchange(false)) { link_queue_up_end_->UnregisterEnqueue(); link_queue_enqueue_registered_ = false; } return packet; } void Fifo::try_register_link_queue_enqueue() { if (link_queue_enqueue_registered_) { if (link_queue_enqueue_registered_.exchange(true)) { return; } link_queue_up_end_->RegisterEnqueue(handler_, common::Bind(&Fifo::link_queue_enqueue_callback, common::Unretained(this))); link_queue_enqueue_registered_ = true; } } // namespace internal Loading
system/gd/l2cap/internal/scheduler_fifo.h +2 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include <atomic> #include <string> #include <unordered_map> Loading Loading @@ -44,7 +45,7 @@ class Fifo : public Scheduler { LowerQueueUpEnd* link_queue_up_end_; os::Handler* handler_; std::queue<std::pair<Cid, int>> next_to_dequeue_and_num_packets; bool link_queue_enqueue_registered_ = false; std::atomic_bool link_queue_enqueue_registered_ = false; void try_register_link_queue_enqueue(); std::unique_ptr<LowerEnqueue> link_queue_enqueue_callback(); Loading
system/gd/l2cap/internal/sender.cc +8 −6 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ Sender::Sender(os::Handler* handler, ILink* link, Scheduler* scheduler, std::sha } Sender::~Sender() { if (is_dequeue_registered_) { if (is_dequeue_registered_.exchange(false)) { queue_end_->UnregisterDequeue(); } } Loading @@ -73,19 +73,21 @@ DataController* Sender::GetDataController() { } void Sender::try_register_dequeue() { if (is_dequeue_registered_) { if (is_dequeue_registered_.exchange(true)) { return; } queue_end_->RegisterDequeue(handler_, common::Bind(&Sender::dequeue_callback, common::Unretained(this))); is_dequeue_registered_ = true; } // From external context void Sender::dequeue_callback() { auto packet = queue_end_->TryDequeue(); ASSERT(packet != nullptr); data_controller_->OnSdu(std::move(packet)); handler_->Post( common::BindOnce(&DataController::OnSdu, common::Unretained(data_controller_.get()), std::move(packet))); if (is_dequeue_registered_.exchange(false)) { queue_end_->UnregisterDequeue(); is_dequeue_registered_ = false; } } void Sender::UpdateClassicConfiguration(classic::internal::ChannelConfigurationState config) { Loading