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

Commit 06ef8f50 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

L2CAP: Minor fixes am: 9c28536b am: da2bd4fa am: 42711147 am: 9b515661

Change-Id: I877979024d4b50975c8f40cb1376ae5ed218d8f2
parents 44e8511e 9b515661
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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
+6 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#pragma once

#include <atomic>
#include <string>
#include <unordered_map>

@@ -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();
+8 −6
Original line number Diff line number Diff line
@@ -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();
  }
}
@@ -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