| // 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/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); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |
| |
| #include "upb/port/undef.inc" |
| |
| #endif // UPB_MINI_TABLE_GENERATED_REGISTRY_H_ |