blob: 193c028961e31fcde894e60dac33df637c2a3ab4 [file] [log] [blame]
// Copyright 2023 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/devices/bin/driver_manager/bind/bind_result_tracker.h"
namespace driver_manager {
BindResultTracker::BindResultTracker(size_t expected_result_count,
NodeBindingInfoResultCallback result_callback)
: expected_result_count_(expected_result_count),
currently_reported_(0),
result_callback_(std::move(result_callback)) {
ZX_ASSERT(expected_result_count > 0);
}
void BindResultTracker::ReportNoBind() {
size_t current;
{
std::scoped_lock guard(lock_);
currently_reported_++;
current = currently_reported_;
}
Complete(current);
}
void BindResultTracker::ReportSuccessfulBind(const std::string_view& node_name,
const std::string_view& driver) {
size_t current;
{
std::scoped_lock guard(lock_);
currently_reported_++;
auto node_binding_info = fuchsia_driver_development::wire::NodeBindingInfo::Builder(arena_)
.node_name(node_name)
.driver_url(driver)
.Build();
results_.emplace_back(node_binding_info);
current = currently_reported_;
}
Complete(current);
}
void BindResultTracker::ReportSuccessfulBind(
const std::string_view& node_name,
const std::vector<fuchsia_driver_legacy::CompositeParent>& legacy_composite_parents,
const std::vector<fuchsia_driver_framework::CompositeParent>& composite_parents) {
size_t current;
{
std::scoped_lock guard(lock_);
currently_reported_++;
auto node_binding_info =
fuchsia_driver_development::wire::NodeBindingInfo::Builder(arena_)
.node_name(node_name)
.legacy_composite_parents(fidl::ToWire(arena_, legacy_composite_parents))
.composite_parents(fidl::ToWire(arena_, composite_parents))
.Build();
results_.emplace_back(node_binding_info);
current = currently_reported_;
}
Complete(current);
}
void BindResultTracker::Complete(size_t current) {
if (current == expected_result_count_) {
result_callback_(
fidl::VectorView<fuchsia_driver_development::wire::NodeBindingInfo>(arena_, results_));
}
}
} // namespace driver_manager