| // Protocol Buffers - Google's data interchange format | |
| // Copyright 2025 Google LLC. All rights reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file or at | |
| // https://developers.google.com/open-source/licenses/bsd | |
| #ifndef UPB_MINI_TABLE_GENERATED_REGISTRY_H_ | |
| #define UPB_MINI_TABLE_GENERATED_REGISTRY_H_ | |
| #include "upb/mini_table/extension_registry.h" | |
| #include "upb/mini_table/internal/generated_registry.h" | |
| // Must be last. | |
| #include "upb/port/def.inc" | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| /* Generated registry: a global singleton that gathers all extensions linked | |
| * into the binary. | |
| * | |
| * This singleton is thread-safe and lock-free, implemented using atomics. The | |
| * registry is lazily initialized the first time it is loaded. When all | |
| * references are released, the registry will be destroyed. New loads | |
| * afterwards will simply reload the same registry as needed. | |
| * | |
| * The extension minitables are registered in gencode using linker arrays. Each | |
| * .proto file produces a weak, hidden, constructor function that adds all | |
| * visible extensions from the array into the registry. In each binary, only | |
| * one copy of the constructor will actually be preserved by the linker, and | |
| * that copy will add all of the extensions for the entire binary. All of these | |
| * are added to a global linked list of minitables pre-main, which are then used | |
| * to construct this singleton as needed. | |
| */ | |
| typedef struct upb_GeneratedRegistryRef upb_GeneratedRegistryRef; | |
| // Loads the generated registry, returning a reference to it. The reference | |
| // must be held for the lifetime of any ExtensionRegistry obtained from it. | |
| // | |
| // Returns NULL on failure. | |
| UPB_API const upb_GeneratedRegistryRef* upb_GeneratedRegistry_Load(void); | |
| // Releases a reference to the generated registry. This may destroy the | |
| // registry if there are no other references to it. | |
| // | |
| // NULL is a valid argument and is simply ignored for easier error handling in | |
| // callers. | |
| UPB_API void upb_GeneratedRegistry_Release(const upb_GeneratedRegistryRef* r); | |
| // Returns the extension registry contained by a reference to the generated | |
| // registry. | |
| // | |
| // The reference must be held for the lifetime of the registry. | |
| UPB_API const upb_ExtensionRegistry* upb_GeneratedRegistry_Get( | |
| const upb_GeneratedRegistryRef* r); | |
| #ifdef __cplusplus | |
| } /* extern "C" */ | |
| #endif | |
| #include "upb/port/undef.inc" | |
| #endif // UPB_MINI_TABLE_GENERATED_REGISTRY_H_ |