blob: bf48a4aca271daab0aa405e2e97fb56e8a500cd5 [file] [log] [blame]
// Copyright 2022 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 "sdk/lib/fdio/fdio_slot.h"
#include "sdk/lib/fdio/internal.h"
fbl::RefPtr<fdio> fdio_slot::get() {
fdio_t** ptr = std::get_if<fdio_t*>(&inner_);
if (ptr != nullptr) {
return fbl::RefPtr(*ptr);
}
return nullptr;
}
fbl::RefPtr<fdio> fdio_slot::release() {
fdio_t** ptr = std::get_if<fdio_t*>(&inner_);
if (ptr != nullptr) {
fbl::RefPtr<fdio> io = fbl::ImportFromRawPtr(*ptr);
inner_ = available{};
return io;
}
return nullptr;
}
bool fdio_slot::try_set(fbl::RefPtr<fdio> io) {
if (std::holds_alternative<available>(inner_)) {
inner_ = fbl::ExportToRawPtr(&io);
return true;
}
return false;
}
fbl::RefPtr<fdio> fdio_slot::replace(fbl::RefPtr<fdio> io) {
auto previous = std::exchange(inner_, fbl::ExportToRawPtr(&io));
fdio_t** ptr = std::get_if<fdio_t*>(&previous);
if (ptr != nullptr) {
return fbl::ImportFromRawPtr(*ptr);
}
return nullptr;
}
std::optional<void (fdio_slot::*)()> fdio_slot::try_reserve() {
if (std::holds_alternative<available>(inner_)) {
inner_ = reserved{};
return &fdio_slot::release_reservation;
}
return std::nullopt;
}
bool fdio_slot::try_fill(fbl::RefPtr<fdio> io) {
if (std::holds_alternative<reserved>(inner_)) {
inner_ = fbl::ExportToRawPtr(&io);
return true;
}
return false;
}
bool fdio_slot::allocated() const { return !std::holds_alternative<available>(inner_); }
void fdio_slot::release_reservation() {
if (std::holds_alternative<reserved>(inner_)) {
inner_ = available{};
}
}