blob: bbe4f1dc53f210ca4ab53d21a7392e8b7b5f68db [file] [log] [blame]
/* Copyright 2025 Google Inc. All Rights Reserved.
Distributed under MIT license.
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
/* Central point for static initialization. */
#ifndef THIRD_PARTY_BROTLI_ENC_STATIC_INIT_H_
#define THIRD_PARTY_BROTLI_ENC_STATIC_INIT_H_
#include "../common/platform.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
/* Static data is "initialized" in compile time. */
#define BROTLI_STATIC_INIT_NONE 0
/* Static data is initialized before "main". */
#define BROTLI_STATIC_INIT_EARLY 1
/* Static data is initialized when first encoder is created. */
#define BROTLI_STATIC_INIT_LAZY 2
#if BROTLI_GNUC_HAS_ATTRIBUTE(constructor, 2, 7, 0) && \
!defined(BROTLI_EXTERNAL_DICTIONARY_DATA)
#define BROTLI_STATIC_INIT_DEFAULT BROTLI_STATIC_INIT_EARLY
#else
#define BROTLI_STATIC_INIT_DEFAULT BROTLI_STATIC_INIT_NONE
#endif
#if !defined(BROTLI_STATIC_INIT)
#define BROTLI_STATIC_INIT BROTLI_STATIC_INIT_DEFAULT
#endif
#if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_NONE) && \
(BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_EARLY) && \
(BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_LAZY)
#error Invalid value for BROTLI_STATIC_INIT
#endif
#if (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_EARLY)
#if defined(BROTLI_EXTERNAL_DICTIONARY_DATA)
#error BROTLI_STATIC_INIT_EARLY will fail with BROTLI_EXTERNAL_DICTIONARY_DATA
#endif
#elif (BROTLI_STATIC_INIT == BROTLI_STATIC_INIT_LAZY)
BROTLI_INTERNAL void BrotliEncoderLazyStaticInitInner(void);
/* This function is not provided by library. Embedder is responsible for
providing it. This function should call `BrotliEncoderLazyStaticInitInner` on
the first invocation. This function should not return until execution of
`BrotliEncoderLazyStaticInitInner` is finished. In C or before C++11 it is
possible to call `BrotliEncoderLazyStaticInitInner` on start-up path and then
`BrotliEncoderLazyStaticInit` is no-op; another option is to use available
thread execution controls to meet the requirements.
For possible C++11 implementation see static_init_lazy.cc.
*/
BROTLI_INTERNAL void BrotliEncoderLazyStaticInit(void);
#endif /* BROTLI_STATIC_INIT */
BROTLI_INTERNAL BROTLI_BOOL BrotliEncoderEnsureStaticInit(void);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
#endif // THIRD_PARTY_BROTLI_ENC_STATIC_INIT_H_