blob: 6e00cd3741f447764327142c6db8df6025e58bd6 [file] [log] [blame]
#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 */