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

Commit 218535ea authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge "RootCanal: Use weak_ptr for Phy, Device" am: 157d27d0

parents ac9673e2 157d27d0
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -31,7 +31,8 @@ void Device::RegisterPhyLayer(std::shared_ptr<PhyLayer> phy) {
}
}


void Device::UnregisterPhyLayers() {
void Device::UnregisterPhyLayers() {
  for (auto phy : phy_layers_) {
  for (auto weak_phy : phy_layers_) {
    auto phy = weak_phy.lock();
    if (phy != nullptr) {
    if (phy != nullptr) {
      phy->Unregister();
      phy->Unregister();
    }
    }
@@ -40,7 +41,8 @@ void Device::UnregisterPhyLayers() {
}
}


void Device::UnregisterPhyLayer(Phy::Type phy_type, uint32_t factory_id) {
void Device::UnregisterPhyLayer(Phy::Type phy_type, uint32_t factory_id) {
  for (auto& phy : phy_layers_) {
  for (auto& weak_phy : phy_layers_) {
    auto phy = weak_phy.lock();
    if (phy != nullptr && phy->IsFactoryId(factory_id) &&
    if (phy != nullptr && phy->IsFactoryId(factory_id) &&
        phy->GetType() == phy_type) {
        phy->GetType() == phy_type) {
      phy->Unregister();
      phy->Unregister();
@@ -59,7 +61,8 @@ bool Device::IsAdvertisementAvailable() const {
void Device::SendLinkLayerPacket(
void Device::SendLinkLayerPacket(
    std::shared_ptr<model::packets::LinkLayerPacketBuilder> to_send,
    std::shared_ptr<model::packets::LinkLayerPacketBuilder> to_send,
    Phy::Type phy_type) {
    Phy::Type phy_type) {
  for (auto phy : phy_layers_) {
  for (auto weak_phy : phy_layers_) {
    auto phy = weak_phy.lock();
    if (phy != nullptr && phy->GetType() == phy_type) {
    if (phy != nullptr && phy->GetType() == phy_type) {
      phy->Send(to_send);
      phy->Send(to_send);
    }
    }
@@ -68,7 +71,8 @@ void Device::SendLinkLayerPacket(


void Device::SendLinkLayerPacket(model::packets::LinkLayerPacketView to_send,
void Device::SendLinkLayerPacket(model::packets::LinkLayerPacketView to_send,
                                 Phy::Type phy_type) {
                                 Phy::Type phy_type) {
  for (auto phy : phy_layers_) {
  for (auto weak_phy : phy_layers_) {
    auto phy = weak_phy.lock();
    if (phy != nullptr && phy->GetType() == phy_type) {
    if (phy != nullptr && phy->GetType() == phy_type) {
      phy->Send(to_send);
      phy->Send(to_send);
    }
    }
+1 −1
Original line number Original line Diff line number Diff line
@@ -85,7 +85,7 @@ class Device {
  void RegisterCloseCallback(std::function<void()>);
  void RegisterCloseCallback(std::function<void()>);


 protected:
 protected:
  std::vector<std::shared_ptr<PhyLayer>> phy_layers_;
  std::vector<std::weak_ptr<PhyLayer>> phy_layers_;


  std::chrono::steady_clock::time_point last_advertisement_;
  std::chrono::steady_clock::time_point last_advertisement_;


+23 −14
Original line number Original line Diff line number Diff line
@@ -88,13 +88,13 @@ void TestModel::Del(size_t dev_index) {
  schedule_task_(model_user_id_, std::chrono::milliseconds(0),
  schedule_task_(model_user_id_, std::chrono::milliseconds(0),
                 [this, dev_index]() {
                 [this, dev_index]() {
                   devices_[dev_index]->UnregisterPhyLayers();
                   devices_[dev_index]->UnregisterPhyLayers();
                   devices_[dev_index] = nullptr;
                   devices_[dev_index].reset();
                 });
                 });
}
}


size_t TestModel::AddPhy(Phy::Type phy_type) {
size_t TestModel::AddPhy(Phy::Type phy_type) {
  size_t factory_id = phys_.size();
  size_t factory_id = phys_.size();
  phys_.emplace_back(phy_type, factory_id);
  phys_.push_back(std::make_shared<PhyLayerFactory>(phy_type, factory_id));
  return factory_id;
  return factory_id;
}
}


@@ -103,9 +103,11 @@ void TestModel::DelPhy(size_t phy_index) {
    LOG_WARN("Unknown phy at index %zu", phy_index);
    LOG_WARN("Unknown phy at index %zu", phy_index);
    return;
    return;
  }
  }
  schedule_task_(
  schedule_task_(model_user_id_, std::chrono::milliseconds(0),
      model_user_id_, std::chrono::milliseconds(0),
                 [this, phy_index]() {
      [this, phy_index]() { phys_[phy_index].UnregisterAllPhyLayers(); });
                   phys_[phy_index]->UnregisterAllPhyLayers();
                   phys_[phy_index].reset();
                 });
}
}


void TestModel::AddDeviceToPhy(size_t dev_index, size_t phy_index) {
void TestModel::AddDeviceToPhy(size_t dev_index, size_t phy_index) {
@@ -118,9 +120,13 @@ void TestModel::AddDeviceToPhy(size_t dev_index, size_t phy_index) {
    return;
    return;
  }
  }
  auto dev = devices_[dev_index];
  auto dev = devices_[dev_index];
  dev->RegisterPhyLayer(phys_[phy_index].GetPhyLayer(
  std::weak_ptr<Device> weak_dev = dev;
      [dev](model::packets::LinkLayerPacketView packet) {
  dev->RegisterPhyLayer(phys_[phy_index]->GetPhyLayer(
        dev->IncomingPacket(std::move(packet));
      [weak_dev](model::packets::LinkLayerPacketView packet) {
        auto device = weak_dev.lock();
        if (device != nullptr) {
          device->IncomingPacket(std::move(packet));
        }
      },
      },
      dev_index));
      dev_index));
}
}
@@ -137,8 +143,8 @@ void TestModel::DelDeviceFromPhy(size_t dev_index, size_t phy_index) {
  schedule_task_(model_user_id_, std::chrono::milliseconds(0),
  schedule_task_(model_user_id_, std::chrono::milliseconds(0),
                 [this, dev_index, phy_index]() {
                 [this, dev_index, phy_index]() {
                   devices_[dev_index]->UnregisterPhyLayer(
                   devices_[dev_index]->UnregisterPhyLayer(
                       phys_[phy_index].GetType(),
                       phys_[phy_index]->GetType(),
                       phys_[phy_index].GetFactoryId());
                       phys_[phy_index]->GetFactoryId());
                 });
                 });
}
}


@@ -150,7 +156,7 @@ void TestModel::AddLinkLayerConnection(std::shared_ptr<Device> dev,
  AsyncUserId user_id = get_user_id_();
  AsyncUserId user_id = get_user_id_();


  for (size_t i = 0; i < phys_.size(); i++) {
  for (size_t i = 0; i < phys_.size(); i++) {
    if (phy_type == phys_[i].GetType()) {
    if (phy_type == phys_[i]->GetType()) {
      AddDeviceToPhy(index, i);
      AddDeviceToPhy(index, i);
    }
    }
  }
  }
@@ -202,8 +208,7 @@ void TestModel::OnConnectionClosed(size_t index, AsyncUserId user_id) {
  }
  }


  cancel_tasks_from_user_(user_id);
  cancel_tasks_from_user_(user_id);
  devices_[index]->UnregisterPhyLayers();
  Del(index);
  devices_[index] = nullptr;
}
}


void TestModel::SetDeviceAddress(size_t index, Address address) {
void TestModel::SetDeviceAddress(size_t index, Address address) {
@@ -228,7 +233,11 @@ const std::string& TestModel::List() {
  list_string_ += " Phys: \r\n";
  list_string_ += " Phys: \r\n";
  for (size_t i = 0; i < phys_.size(); i++) {
  for (size_t i = 0; i < phys_.size(); i++) {
    list_string_ += "  " + std::to_string(i) + ":";
    list_string_ += "  " + std::to_string(i) + ":";
    list_string_ += phys_[i].ToString() + " \r\n";
    if (phys_[i] == nullptr) {
      list_string_ += " deleted \r\n";
    } else {
      list_string_ += phys_[i]->ToString() + " \r\n";
    }
  }
  }
  return list_string_;
  return list_string_;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -100,7 +100,7 @@ class TestModel {
  void Reset();
  void Reset();


 private:
 private:
  std::vector<PhyLayerFactory> phys_;
  std::vector<std::shared_ptr<PhyLayerFactory>> phys_;
  std::vector<std::shared_ptr<Device>> devices_;
  std::vector<std::shared_ptr<Device>> devices_;
  std::string list_string_;
  std::string list_string_;