blob: d11729cce0fc7d21d10d44ab61df83abf2e81842 [file] [log] [blame]
// Copyright 2019 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_UI_SCENIC_LIB_FLATLAND_UBER_STRUCT_SYSTEM_H_
#define SRC_UI_SCENIC_LIB_FLATLAND_UBER_STRUCT_SYSTEM_H_
#include <mutex>
#include <unordered_map>
#include "src/ui/scenic/lib/flatland/transform_handle.h"
#include "src/ui/scenic/lib/flatland/uber_struct.h"
namespace flatland {
// TODO(#####): write a bug to find a better name for this system
//
// A system for aggregating local data from Flatland instances to be consumed by the render loop.
// All functions are thread safe. The intent is for separate worker threads to own each Flatland
// instance, compute local data (such as topology vectors) in their local thread, and then commit
// those vectors to this class in a concurrent manner.
class UberStructSystem {
public:
UberStructSystem() = default;
// Returns the next instance ID for this particular UberStructSystem. Instance IDs are guaranteed
// to be unique for each caller and should be used as keys for setting UberStructs and accessing
// UberStructs in snapshots.
TransformHandle::InstanceId GetNextInstanceId();
// Sets the UberStruct for |id|. Each instance ID many only have one UberStruct committed to the
// system at a time, so calling SetUberStruct again will override the existing value.
void SetUberStruct(TransformHandle::InstanceId id, std::unique_ptr<UberStruct> uber_struct);
// Clears an UberStruct from the system.
void ClearUberStruct(TransformHandle::InstanceId id);
// Snapshots the current map of UberStructs and returns the copy.
UberStruct::InstanceMap Snapshot();
// For validating cleanup logic in tests.
size_t GetSize();
private:
std::atomic<TransformHandle::InstanceId> next_graph_id_ = 0;
// TODO(44335): This map is modified by Flatland instances when Flatland::Present() is called, and
// read within ComputeGlobalTopologyData() on the render thread, producing a possible priority
// inversion between the two threads.
std::mutex map_mutex_;
UberStruct::InstanceMap uber_struct_map_;
};
} // namespace flatland
#endif // SRC_UI_SCENIC_LIB_FLATLAND_UBER_STRUCT_SYSTEM_H_