Implements sharing policy for split-duplex links.
Replicate config for each up/down link
Link* Link::set_sharing_policy(Link::SharingPolicy policy, const NonLinearResourceCb& cb)
{
- if (policy == SharingPolicy::SPLITDUPLEX)
- throw std::invalid_argument(std::string("Impossible to set split-duplex for the link: ") + get_name() +
- std::string(". Use NetZone::create_split_duplex_link."));
+ if (policy == SharingPolicy::SPLITDUPLEX || policy == SharingPolicy::WIFI)
+ throw std::invalid_argument(std::string("Impossible to set wifi or split-duplex for the link: ") + get_name() +
+ std::string(". Use appropriate create function in NetZone."));
kernel::actor::simcall([this, policy, &cb] { pimpl_->set_sharing_policy(policy, cb); });
return this;
void SplitDuplexLinkImpl::set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
{
- xbt_die("Impossible to change sharing policy of split-duplex links");
+ xbt_assert(policy != s4u::Link::SharingPolicy::SPLITDUPLEX && policy != s4u::Link::SharingPolicy::WIFI,
+ "Invalid sharing policy for split-duplex links");
+ link_up_->set_sharing_policy(policy, cb);
+ link_down_->set_sharing_policy(policy, cb);
}
void SplitDuplexLinkImpl::set_bandwidth(double value)
TEST_CASE("SplitDuplexLink: sets", "")
{
simgrid::s4u::Engine e("test");
- auto* zone = simgrid::s4u::create_star_zone("test");
- auto* link = zone->create_split_duplex_link("link", 100e6);
+ auto* zone = simgrid::s4u::create_star_zone("test");
+ auto* link = zone->create_split_duplex_link("link", 100e6);
auto const* link_up = link->get_link_up();
auto const* link_down = link->get_link_down();
REQUIRE(link_up->get_impl()->get_constraint()->get_concurrency_limit() == 3);
REQUIRE(link_down->get_impl()->get_constraint()->get_concurrency_limit() == 3);
}
+
+ SECTION("sharing_policy: invalid")
+ {
+ REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::WIFI), std::invalid_argument);
+ REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX), std::invalid_argument);
+ }
+
+ SECTION("sharing_policy: fatpipe/shared")
+ {
+ for (const auto& policy : {simgrid::s4u::Link::SharingPolicy::FATPIPE, simgrid::s4u::Link::SharingPolicy::SHARED}) {
+ link->set_sharing_policy(policy);
+ REQUIRE(link_up->get_sharing_policy() == policy);
+ REQUIRE(link_down->get_sharing_policy() == policy);
+ }
+ }
+
+ SECTION("sharing_policy: nonlinear")
+ {
+ link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::NONLINEAR, [](double c, int n) -> double { return c; });
+ REQUIRE(link_up->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
+ REQUIRE(link_down->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
+ }
}
if (args->policy == simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX) {
link = current_routing->create_split_duplex_link(args->id, args->bandwidths);
} else {
- link = current_routing->create_link(args->id, args->bandwidths)->set_sharing_policy(args->policy);
+ link = current_routing->create_link(args->id, args->bandwidths);
+ link->get_impl()->set_sharing_policy(args->policy, {});
}
sg_platf_set_link_properties(link, args);
link->seal();