1*2b54f0dbSXin Li #if defined(_WIN32) || defined(__CYGWIN__)
2*2b54f0dbSXin Li #include <windows.h>
3*2b54f0dbSXin Li #elif !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)
4*2b54f0dbSXin Li #include <pthread.h>
5*2b54f0dbSXin Li #endif
6*2b54f0dbSXin Li
7*2b54f0dbSXin Li #include <cpuinfo.h>
8*2b54f0dbSXin Li #include <cpuinfo/internal-api.h>
9*2b54f0dbSXin Li #include <cpuinfo/log.h>
10*2b54f0dbSXin Li
11*2b54f0dbSXin Li #ifdef __APPLE__
12*2b54f0dbSXin Li #include "TargetConditionals.h"
13*2b54f0dbSXin Li #endif
14*2b54f0dbSXin Li
15*2b54f0dbSXin Li
16*2b54f0dbSXin Li #if defined(_WIN32) || defined(__CYGWIN__)
17*2b54f0dbSXin Li static INIT_ONCE init_guard = INIT_ONCE_STATIC_INIT;
18*2b54f0dbSXin Li #elif !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)
19*2b54f0dbSXin Li static pthread_once_t init_guard = PTHREAD_ONCE_INIT;
20*2b54f0dbSXin Li #else
21*2b54f0dbSXin Li static bool init_guard = false;
22*2b54f0dbSXin Li #endif
23*2b54f0dbSXin Li
cpuinfo_initialize(void)24*2b54f0dbSXin Li bool CPUINFO_ABI cpuinfo_initialize(void) {
25*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
26*2b54f0dbSXin Li #if defined(__MACH__) && defined(__APPLE__)
27*2b54f0dbSXin Li pthread_once(&init_guard, &cpuinfo_x86_mach_init);
28*2b54f0dbSXin Li #elif defined(__linux__)
29*2b54f0dbSXin Li pthread_once(&init_guard, &cpuinfo_x86_linux_init);
30*2b54f0dbSXin Li #elif defined(_WIN32) || defined(__CYGWIN__)
31*2b54f0dbSXin Li InitOnceExecuteOnce(&init_guard, &cpuinfo_x86_windows_init, NULL, NULL);
32*2b54f0dbSXin Li #else
33*2b54f0dbSXin Li cpuinfo_log_error("operating system is not supported in cpuinfo");
34*2b54f0dbSXin Li #endif
35*2b54f0dbSXin Li #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
36*2b54f0dbSXin Li #if defined(__linux__)
37*2b54f0dbSXin Li pthread_once(&init_guard, &cpuinfo_arm_linux_init);
38*2b54f0dbSXin Li #elif defined(__MACH__) && defined(__APPLE__)
39*2b54f0dbSXin Li pthread_once(&init_guard, &cpuinfo_arm_mach_init);
40*2b54f0dbSXin Li #elif defined(_WIN32)
41*2b54f0dbSXin Li InitOnceExecuteOnce(&init_guard, &cpuinfo_arm_windows_init, NULL, NULL);
42*2b54f0dbSXin Li #else
43*2b54f0dbSXin Li cpuinfo_log_error("operating system is not supported in cpuinfo");
44*2b54f0dbSXin Li #endif
45*2b54f0dbSXin Li #elif CPUINFO_ARCH_ASMJS || CPUINFO_ARCH_WASM || CPUINFO_ARCH_WASMSIMD
46*2b54f0dbSXin Li #if defined(__EMSCRIPTEN_PTHREADS__)
47*2b54f0dbSXin Li pthread_once(&init_guard, &cpuinfo_emscripten_init);
48*2b54f0dbSXin Li #else
49*2b54f0dbSXin Li if (!init_guard) {
50*2b54f0dbSXin Li cpuinfo_emscripten_init();
51*2b54f0dbSXin Li }
52*2b54f0dbSXin Li init_guard = true;
53*2b54f0dbSXin Li #endif
54*2b54f0dbSXin Li #else
55*2b54f0dbSXin Li cpuinfo_log_error("processor architecture is not supported in cpuinfo");
56*2b54f0dbSXin Li #endif
57*2b54f0dbSXin Li return cpuinfo_is_initialized;
58*2b54f0dbSXin Li }
59*2b54f0dbSXin Li
cpuinfo_deinitialize(void)60*2b54f0dbSXin Li void CPUINFO_ABI cpuinfo_deinitialize(void) {
61*2b54f0dbSXin Li }
62