| // 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 |