xref: /aosp_15_r20/external/cpuinfo/src/init.c (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
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