blob: 0ccccf0e008f5168a5cd9732cd6508ed8456bf74 [file] [log] [blame]
// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/testing/stubs/system_activity_governor.h"
#include <lib/async/cpp/wait.h>
#include <lib/zx/event.h>
#include <utility>
namespace forensics::stubs {
namespace {
using fuchsia_power_system::LeaseToken;
} // namespace
void SystemActivityGovernor::AcquireWakeLease(AcquireWakeLeaseRequest& request,
AcquireWakeLeaseCompleter::Sync& completer) {
LeaseToken client_token, server_token;
LeaseToken::create(/*options=*/0u, &client_token, &server_token);
// Start an async task to wait for EVENTPAIR_PEER_CLOSED signal on server_token.
zx_handle_t token_handle = server_token.get();
active_wake_leases_[token_handle] = std::move(server_token);
auto wait = std::make_unique<async::WaitOnce>(token_handle, ZX_EVENTPAIR_PEER_CLOSED);
wait->Begin(dispatcher_, [this, token_handle, wait = std::move(wait)](
async_dispatcher_t*, async::WaitOnce*, zx_status_t status,
const zx_packet_signal_t*) {
FX_CHECK(status == ZX_OK);
FX_CHECK(active_wake_leases_.contains(token_handle));
active_wake_leases_.erase(token_handle);
});
completer.Reply(fit::ok(std::move(client_token)));
}
} // namespace forensics::stubs