blob: 22b752850754ef1fd4c82657730f01028fc83725 [file] [log] [blame]
// 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_