| #include "../common/platform.h" | |
| #include "../common/static_init.h" | |
| #include "static_init.h" | |
| #if (BROTLI_STATIC_INIT != BROTLI_STATIC_INIT_LAZY) | |
| #error "BROTLI_STATIC_INIT should be BROTLI_STATIC_INIT_LAZY" | |
| #else | |
| void BrotliEncoderLazyStaticInit(void) { | |
| /* From https://en.cppreference.com/w/cpp/language/storage_duration.html: | |
| ### Static block variables ### | |
| Block variables with static or thread (since C++11) storage duration are | |
| initialized the first time control passes through their declaration... | |
| On all further calls, the declaration is skipped... | |
| If multiple threads attempt to initialize the same static local variable | |
| concurrently, the initialization occurs exactly once... | |
| Usual implementations of this feature use variants of the double-checked | |
| locking pattern, which reduces runtime overhead for already-initialized | |
| local statics to a single non-atomic boolean comparison. | |
| */ | |
| static bool ok = [](){ | |
| BrotliEncoderLazyStaticInitInner(); | |
| return true; | |
| }(); | |
| if (!ok) BROTLI_CRASH(); | |
| } | |
| #endif /* BROTLI_STATIC_INIT_LAZY */ |