Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 36 additions & 13 deletions score/mw/com/impl/skeleton_base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@
#include "score/mw/com/impl/skeleton_field_base.h"
#include "score/mw/com/impl/tracing/skeleton_tracing.h"

#include "score/scope_exit/scope_exit.h"

#include "score/mw/log/logging.h"

#include <score/assert.hpp>
#include <score/utility.hpp>

#include <algorithm>
#include <exception>
#include <functional>
#include <utility>
#include <vector>
Expand Down Expand Up @@ -99,8 +100,9 @@ SkeletonBase::SkeletonBase(std::unique_ptr<SkeletonBinding> skeleton_binding, In
"Skeleton binding should be checked in SkeletonWrapperClass::Create() before constructing the SkeletonBase.");
}

score::Result<void> SkeletonBase::OfferServiceEvents() const noexcept
score::Result<std::vector<utils::ScopeExit<>>> SkeletonBase::OfferServiceEvents() const noexcept
{
std::vector<utils::ScopeExit<>> offer_guards{};
for (const auto& event : events_)
{
const auto event_name = event.first;
Expand All @@ -113,12 +115,16 @@ score::Result<void> SkeletonBase::OfferServiceEvents() const noexcept
<< ": Reason:" << offer_result.error().Message() << ": " << offer_result.error().UserMessage();
return MakeUnexpected(ComErrc::kBindingFailure);
}
offer_guards.emplace_back([&skeleton_event]() {
skeleton_event.PrepareStopOffer();
});
}
return {};
return {std::move(offer_guards)};
}

score::Result<void> SkeletonBase::OfferServiceFields() const noexcept
score::Result<std::vector<utils::ScopeExit<>>> SkeletonBase::OfferServiceFields() const noexcept
{
std::vector<utils::ScopeExit<>> offer_guards{};
for (const auto& field : fields_)
{
const auto field_name = field.first;
Expand All @@ -135,8 +141,11 @@ score::Result<void> SkeletonBase::OfferServiceFields() const noexcept
}
return MakeUnexpected(ComErrc::kBindingFailure);
}
offer_guards.emplace_back([&skeleton_field]() {
skeleton_field.PrepareStopOffer();
});
}
return {};
return {std::move(offer_guards)};
}

auto SkeletonBase::OfferService() noexcept -> Result<void>
Expand Down Expand Up @@ -166,21 +175,22 @@ auto SkeletonBase::OfferService() noexcept -> Result<void>
<< result.error().UserMessage();
return MakeUnexpected(ComErrc::kBindingFailure);
}
utils::ScopeExit binding_offer_guard{[this]() {
binding_->PrepareStopOffer({});
}};

const auto event_verification_result = OfferServiceEvents();
if (!event_verification_result.has_value())
auto event_offer_guards_result = OfferServiceEvents();
if (!event_offer_guards_result.has_value())
{
return event_verification_result;
return MakeUnexpected<void>(event_offer_guards_result.error());
}

const auto fields_verification_result = OfferServiceFields();
if (!fields_verification_result.has_value())
auto field_offer_guards_result = OfferServiceFields();
if (!field_offer_guards_result.has_value())
{
return fields_verification_result;
return MakeUnexpected<void>(field_offer_guards_result.error());
}

service_offered_flag_.Set();

const auto service_discovery_offer_result = Runtime::getInstance().GetServiceDiscovery().OfferService(instance_id_);
if (!service_discovery_offer_result.has_value())
{
Expand All @@ -191,6 +201,19 @@ auto SkeletonBase::OfferService() noexcept -> Result<void>
return MakeUnexpected(ComErrc::kBindingFailure);
}

service_offered_flag_.Set();

// Since the service has been successfully offered, we release the offer guards so that they do not call
// PrepareStopOffer() when they go out of scope.
binding_offer_guard.Release();
auto release_guards = [](auto& offer_guards) {
for (auto& guard : offer_guards)
{
guard.Release();
}
};
release_guards(event_offer_guards_result.value());
release_guards(field_offer_guards_result.value());
return {};
}

Expand Down
5 changes: 3 additions & 2 deletions score/mw/com/impl/skeleton_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "score/mw/com/impl/mocking/i_skeleton_base.h"

#include "score/result/result.h"
#include "score/scope_exit/scope_exit.h"

#include <score/span.hpp>
#include <optional>
Expand Down Expand Up @@ -108,8 +109,8 @@ class SkeletonBase

ISkeletonBase* skeleton_mock_;

[[nodiscard]] score::Result<void> OfferServiceEvents() const noexcept;
[[nodiscard]] score::Result<void> OfferServiceFields() const noexcept;
[[nodiscard]] score::Result<std::vector<utils::ScopeExit<>>> OfferServiceEvents() const noexcept;
[[nodiscard]] score::Result<std::vector<utils::ScopeExit<>>> OfferServiceFields() const noexcept;

FlagOwner service_offered_flag_;
};
Expand Down
Loading
Loading