blob: c329ef25a9bd3573d8955b29aabdb4fa4b41c083 [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "libhwsec/structures/event.h"
#include <optional>
#include <utility>
#include <libhwsec-foundation/status/status_chain_macros.h>
#include "libhwsec/backend/backend.h"
#include "libhwsec/middleware/middleware.h"
namespace hwsec {
ScopedEvent::ScopedEvent(ScopedEvent&& scoped_event)
: event_(std::move(scoped_event.event_)),
middleware_derivative_(std::move(scoped_event.middleware_derivative_)) {
scoped_event.event_.clear();
}
ScopedEvent::~ScopedEvent() {
Stop();
}
void ScopedEvent::Stop() {
if (!event_.empty()) {
std::string event(std::move(event_));
event_.clear();
// Using async stop if we have task runner on the current thread to improve
// the performance.
if (base::SequencedTaskRunner::HasCurrentDefault()) {
base::OnceCallback<void(hwsec::Status)> callback = base::BindOnce(
[](const std::string& event, hwsec::Status result) {
if (!result.ok()) {
LOG(ERROR) << "Failed to stop event(" << event << "): " << result;
}
},
event);
Middleware(middleware_derivative_)
.CallAsync<&hwsec::Backend::EventManagement::Stop>(
std::move(callback), event);
} else {
RETURN_IF_ERROR(
Middleware(middleware_derivative_)
.CallSync<&hwsec::Backend::EventManagement::Stop>(event))
.With([event](auto linker) {
return linker.LogError() << "Failed to stop event(" << event << ")";
})
.ReturnVoid();
}
}
}
ScopedEvent& ScopedEvent::operator=(ScopedEvent&& scoped_event) {
Stop();
event_ = std::move(scoped_event.event_);
middleware_derivative_ = std::move(scoped_event.middleware_derivative_);
scoped_event.event_.clear();
return *this;
}
ScopedEvent::ScopedEvent(const std::string& event,
MiddlewareDerivative middleware_derivative)
: event_(event), middleware_derivative_(std::move(middleware_derivative)) {}
} // namespace hwsec