blob: daadc4b946a3c326e2ca69c2aababd475f8a1e97 [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.
#ifndef SRC_DEVICES_BIN_DRIVER_MANAGER_PARENT_SET_COLLECTOR_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_PARENT_SET_COLLECTOR_H_
#include <fidl/fuchsia.driver.framework/cpp/fidl.h>
#include <fidl/fuchsia.driver.index/cpp/wire.h>
#include <vector>
#include "src/devices/bin/driver_manager/node.h"
namespace driver_manager {
// |ParentSetCollector| wraps functionality for collecting multiple parent nodes for composites.
// The parent set starts out empty and gets nodes added to it until it is complete. Once complete
// it will return a vector containing all the parent node pointers.
class ParentSetCollector {
public:
explicit ParentSetCollector(std::string composite_name, std::vector<std::string> parent_names,
uint32_t primary_index)
: composite_name_(std::move(composite_name)),
parents_(parent_names.size()),
parent_names_(std::move(parent_names)),
parent_properties_(parent_names_.size()),
primary_index_(primary_index) {}
// Add a node to the parent set at the specified index.
// Caller should check that |ContainsNode| is false for the index before calling this.
// Only a weak_ptr of the node is stored by this class (until collection in GetIfComplete).
zx::result<> AddNode(uint32_t index,
const std::vector<fuchsia_driver_framework::NodeProperty>& node_properties,
std::weak_ptr<Node> node);
// Check if all parents are found. If so, then create and return the composite node. If the
// node is already created, return ZX_ERR_ALREADY_EXISTS.
zx::result<std::shared_ptr<Node>> TryToAssemble(NodeManager* node_manager,
async_dispatcher_t* dispatcher);
fidl::VectorView<fidl::StringView> GetParentTopologicalPaths(fidl::AnyArena& arena) const;
const std::weak_ptr<Node>& get(uint32_t index) const { return parents_[index]; }
uint32_t primary_index() const { return primary_index_; }
std::optional<std::weak_ptr<driver_manager::Node>> completed_composite_node() const {
return completed_composite_node_;
}
private:
std::string composite_name_;
// Nodes are stored as weak_ptrs. Only when trying to collect the completed set are they
// locked into shared_ptrs and validated to not be null.
std::vector<std::weak_ptr<Node>> parents_;
std::vector<std::string> parent_names_;
std::vector<fuchsia_driver_framework::NodePropertyEntry> parent_properties_;
uint32_t primary_index_;
// Contains a weak pointer to the composite node when the parent set is assembled.
std::optional<std::weak_ptr<driver_manager::Node>> completed_composite_node_;
};
} // namespace driver_manager
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_PARENT_SET_COLLECTOR_H_