PR-URL: https://github.com/nodejs/node/pull/60540 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
26 lines
1.1 KiB
C++
26 lines
1.1 KiB
C++
#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 */
|