| // Copyright 2017 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 GARNET_LIB_UI_GFX_ENGINE_UNRESOLVED_IMPORTS_H_ |
| #define GARNET_LIB_UI_GFX_ENGINE_UNRESOLVED_IMPORTS_H_ |
| |
| #include <unordered_map> |
| |
| #include <lib/async/cpp/wait.h> |
| |
| #include "garnet/lib/ui/gfx/resources/import.h" |
| |
| namespace scenic_impl { |
| namespace gfx { |
| |
| // Stores a list of imports that have not yet been bound to an export handle. |
| class UnresolvedImports { |
| public: |
| UnresolvedImports(ResourceLinker* resource_linker); |
| |
| // Adds an entry for an unresolved import. |import_koid| must be the koid |
| // for |import_token|. |
| void AddUnresolvedImport(Import* import, zx::eventpair import_token, |
| zx_koid_t import_koid); |
| |
| // Listen for the death of the corresponding export token and removes any |
| // matching imports if that happens. |
| // If |import| is not in the collection of unresolved imports, this is a |
| // no-op. |
| void ListenForTokenPeerDeath(Import* import); |
| |
| // Removes and returns all imports corresponding to |import_koid|. |
| std::vector<Import*> GetAndRemoveUnresolvedImportsForKoid( |
| zx_koid_t import_koid); |
| |
| // A callback that informs us when an import has been destroyed. |
| void OnImportDestroyed(Import* import); |
| |
| size_t NumUnresolvedImportsForKoid(zx_koid_t import_koid) const; |
| |
| size_t size() const { return imports_.size(); } |
| |
| private: |
| struct ImportEntry { |
| Import* import_ptr; |
| zx::eventpair import_token; |
| zx_koid_t import_koid; |
| std::unique_ptr<async::Wait> token_peer_death_waiter; |
| }; |
| |
| void OnTokenPeerDeath(zx_koid_t import_koid, zx_status_t status, |
| const zx_packet_signal* signal); |
| |
| std::vector<Import*> RemoveUnresolvedImportsForKoid(zx_koid_t import_koid); |
| |
| using ImportKoid = zx_koid_t; |
| using ImportPtrsToImportEntries = std::unordered_map<Import*, ImportEntry>; |
| using KoidsToImportPtrs = |
| std::unordered_map<ImportKoid, std::vector<Import*>>; |
| |
| ImportPtrsToImportEntries imports_; |
| KoidsToImportPtrs koids_to_import_ptrs_; |
| ResourceLinker* resource_linker_; |
| }; |
| |
| } // namespace gfx |
| } // namespace scenic_impl |
| |
| #endif // GARNET_LIB_UI_GFX_ENGINE_UNRESOLVED_IMPORTS_H_ |