Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions src/arm/linux/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -1001,3 +1001,43 @@ void cpuinfo_arm_linux_init(void) {
free(linux_cpu_to_core_map);
free(linux_cpu_to_uarch_index_map);
}

void cpuinfo_arm_linux_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

/* cpuinfo_packages points to static storage (&package) — do not free */
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

free(cpuinfo_uarchs);
cpuinfo_uarchs = NULL;
cpuinfo_uarchs_count = 0;

for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
free(cpuinfo_cache[lvl]);
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;

free(cpuinfo_linux_cpu_to_processor_map);
cpuinfo_linux_cpu_to_processor_map = NULL;

free(cpuinfo_linux_cpu_to_core_map);
cpuinfo_linux_cpu_to_core_map = NULL;

free((void*)cpuinfo_linux_cpu_to_uarch_index_map);
cpuinfo_linux_cpu_to_uarch_index_map = NULL;

cpuinfo_linux_cpu_max = 0;
}
29 changes: 29 additions & 0 deletions src/arm/mach/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -755,3 +755,32 @@ void cpuinfo_arm_mach_init(void) {
free(l2);
free(l3);
}

void cpuinfo_arm_mach_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

free(cpuinfo_packages);
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

free(cpuinfo_uarchs);
cpuinfo_uarchs = NULL;
cpuinfo_uarchs_count = 0;

for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
free(cpuinfo_cache[lvl]);
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;
}
34 changes: 34 additions & 0 deletions src/arm/windows/init-by-logical-sys-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,40 @@ bool cpu_info_init_by_logical_sys_info(const struct woa_chip_info* chip_info, co
return result;
}

BOOL CALLBACK cpuinfo_arm_windows_deinit(PINIT_ONCE init_once, PVOID parameter, PVOID* context) {
HANDLE heap = GetProcessHeap();

HeapFree(heap, 0, cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

HeapFree(heap, 0, cpuinfo_packages);
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

HeapFree(heap, 0, cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

HeapFree(heap, 0, cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

HeapFree(heap, 0, cpuinfo_uarchs);
cpuinfo_uarchs = NULL;
cpuinfo_uarchs_count = 0;

/* Caches are allocated as a single contiguous block starting at l1i */
HeapFree(heap, 0, cpuinfo_cache[cpuinfo_cache_level_1i]);
for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;

return TRUE;
}

static uint32_t count_logical_processors(const uint32_t max_group_count, uint32_t* global_proc_index_per_group) {
uint32_t nr_of_processors = 0;

Expand Down
20 changes: 20 additions & 0 deletions src/cpuinfo/internal-api.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ extern CPUINFO_INTERNAL struct cpuinfo_uarch_info cpuinfo_global_uarch;
extern CPUINFO_INTERNAL uint32_t cpuinfo_linux_cpu_max;
extern CPUINFO_INTERNAL const struct cpuinfo_processor** cpuinfo_linux_cpu_to_processor_map;
extern CPUINFO_INTERNAL const struct cpuinfo_core** cpuinfo_linux_cpu_to_core_map;
#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64 || CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
Comment thread
crvineeth97 marked this conversation as resolved.
extern CPUINFO_INTERNAL const uint32_t* cpuinfo_linux_cpu_to_uarch_index_map;
#endif
#endif

CPUINFO_PRIVATE void cpuinfo_x86_mach_init(void);
Expand All @@ -62,6 +65,23 @@ CPUINFO_PRIVATE void cpuinfo_arm_linux_init(void);
CPUINFO_PRIVATE void cpuinfo_riscv_linux_init(void);
CPUINFO_PRIVATE void cpuinfo_emscripten_init(void);

/* Platform-specific deinitialization functions.
* Each frees the globals allocated by its corresponding init function. */
CPUINFO_PRIVATE void cpuinfo_x86_mach_deinit(void);
CPUINFO_PRIVATE void cpuinfo_x86_linux_deinit(void);
CPUINFO_PRIVATE void cpuinfo_x86_freebsd_deinit(void);
#if defined(_WIN32) || defined(__CYGWIN__)
#if CPUINFO_ARCH_ARM64
CPUINFO_PRIVATE BOOL CALLBACK cpuinfo_arm_windows_deinit(PINIT_ONCE init_once, PVOID parameter, PVOID* context);
#else
CPUINFO_PRIVATE BOOL CALLBACK cpuinfo_x86_windows_deinit(PINIT_ONCE init_once, PVOID parameter, PVOID* context);
#endif
#endif
CPUINFO_PRIVATE void cpuinfo_arm_mach_deinit(void);
CPUINFO_PRIVATE void cpuinfo_arm_linux_deinit(void);
CPUINFO_PRIVATE void cpuinfo_riscv_linux_deinit(void);
CPUINFO_PRIVATE void cpuinfo_emscripten_deinit(void);

CPUINFO_PRIVATE uint32_t cpuinfo_compute_max_cache_size(const struct cpuinfo_processor* processor);

typedef void (*cpuinfo_processor_callback)(uint32_t);
32 changes: 32 additions & 0 deletions src/emscripten/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,3 +286,35 @@ void cpuinfo_emscripten_init(void) {
free(l1d);
free(l2);
}

void cpuinfo_emscripten_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

/* cpuinfo_packages points to static storage (&static_package) — do not free */
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

/* L1i, L1d, L2 are dynamically allocated; L3 may point to static
* storage (&static_x86_l3) so only free levels that were calloc'd */
free(cpuinfo_cache[cpuinfo_cache_level_1i]);
free(cpuinfo_cache[cpuinfo_cache_level_1d]);
free(cpuinfo_cache[cpuinfo_cache_level_2]);
/* cpuinfo_cache[cpuinfo_cache_level_3] may be &static_x86_l3 — do not free */
for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;

cpuinfo_global_uarch = (struct cpuinfo_uarch_info){0};
}
53 changes: 52 additions & 1 deletion src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@

#if defined(_WIN32) || defined(__CYGWIN__)
static INIT_ONCE init_guard = INIT_ONCE_STATIC_INIT;
static INIT_ONCE deinit_guard = INIT_ONCE_STATIC_INIT;
#elif !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)
static pthread_once_t init_guard = PTHREAD_ONCE_INIT;
static pthread_once_t deinit_guard = PTHREAD_ONCE_INIT;
#else
static bool init_guard = false;
static bool deinit_guard = false;
#endif

bool CPUINFO_ABI cpuinfo_initialize(void) {
Expand Down Expand Up @@ -64,4 +67,52 @@ bool CPUINFO_ABI cpuinfo_initialize(void) {
return cpuinfo_is_initialized;
}

void CPUINFO_ABI cpuinfo_deinitialize(void) {}
void CPUINFO_ABI cpuinfo_deinitialize(void) {
if (!cpuinfo_is_initialized) {
return;
}
cpuinfo_is_initialized = false;
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
#if defined(__MACH__) && defined(__APPLE__)
pthread_once(&deinit_guard, &cpuinfo_x86_mach_deinit);
#elif defined(__FreeBSD__)
pthread_once(&deinit_guard, &cpuinfo_x86_freebsd_deinit);
#elif defined(__linux__)
pthread_once(&deinit_guard, &cpuinfo_x86_linux_deinit);
#elif defined(_WIN32) || defined(__CYGWIN__)
InitOnceExecuteOnce(&deinit_guard, &cpuinfo_x86_windows_deinit, NULL, NULL);
#endif
#elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
#if defined(__linux__)
pthread_once(&deinit_guard, &cpuinfo_arm_linux_deinit);
#elif defined(__MACH__) && defined(__APPLE__)
pthread_once(&deinit_guard, &cpuinfo_arm_mach_deinit);
#elif defined(_WIN32)
InitOnceExecuteOnce(&deinit_guard, &cpuinfo_arm_windows_deinit, NULL, NULL);
#endif
#elif CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
#if defined(__linux__)
pthread_once(&deinit_guard, &cpuinfo_riscv_linux_deinit);
#endif
#elif CPUINFO_ARCH_ASMJS || CPUINFO_ARCH_WASM || CPUINFO_ARCH_WASMSIMD
#if defined(__EMSCRIPTEN_PTHREADS__)
pthread_once(&deinit_guard, &cpuinfo_emscripten_deinit);
#else
if (!deinit_guard) {
cpuinfo_emscripten_deinit();
}
deinit_guard = true;
#endif
#endif
/* Reset guards to allow re-initialization */
#if defined(_WIN32) || defined(__CYGWIN__)
init_guard = INIT_ONCE_STATIC_INIT;
deinit_guard = INIT_ONCE_STATIC_INIT;
#elif !defined(__EMSCRIPTEN__) || defined(__EMSCRIPTEN_PTHREADS__)
init_guard = PTHREAD_ONCE_INIT;
deinit_guard = PTHREAD_ONCE_INIT;
#else
init_guard = false;
deinit_guard = false;
#endif
}
33 changes: 33 additions & 0 deletions src/riscv/linux/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,3 +618,36 @@ void cpuinfo_riscv_linux_init(void) {
free(linux_cpu_to_core_map);
free(linux_cpu_to_uarch_index_map);
}

void cpuinfo_riscv_linux_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

free(cpuinfo_packages);
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

free(cpuinfo_uarchs);
cpuinfo_uarchs = NULL;
cpuinfo_uarchs_count = 0;

free(cpuinfo_linux_cpu_to_processor_map);
cpuinfo_linux_cpu_to_processor_map = NULL;

free(cpuinfo_linux_cpu_to_core_map);
cpuinfo_linux_cpu_to_core_map = NULL;

free((void*)cpuinfo_linux_cpu_to_uarch_index_map);
cpuinfo_linux_cpu_to_uarch_index_map = NULL;

cpuinfo_linux_cpu_max = 0;
}
27 changes: 27 additions & 0 deletions src/x86/freebsd/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,3 +396,30 @@ void cpuinfo_x86_freebsd_init(void) {
free(l3);
free(l4);
}

void cpuinfo_x86_freebsd_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

free(cpuinfo_packages);
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
free(cpuinfo_cache[lvl]);
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;

cpuinfo_global_uarch = (struct cpuinfo_uarch_info){0};
}
35 changes: 35 additions & 0 deletions src/x86/linux/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -676,3 +676,38 @@ void cpuinfo_x86_linux_init(void) {
free(linux_cpu_to_processor_map);
free(linux_cpu_to_core_map);
}

void cpuinfo_x86_linux_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

free(cpuinfo_packages);
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
free(cpuinfo_cache[lvl]);
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;

free(cpuinfo_linux_cpu_to_processor_map);
cpuinfo_linux_cpu_to_processor_map = NULL;

free(cpuinfo_linux_cpu_to_core_map);
cpuinfo_linux_cpu_to_core_map = NULL;

cpuinfo_linux_cpu_max = 0;

cpuinfo_global_uarch = (struct cpuinfo_uarch_info){0};
}
27 changes: 27 additions & 0 deletions src/x86/mach/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,3 +378,30 @@ void cpuinfo_x86_mach_init(void) {
free(l3);
free(l4);
}

void cpuinfo_x86_mach_deinit(void) {
free(cpuinfo_processors);
cpuinfo_processors = NULL;
cpuinfo_processors_count = 0;

free(cpuinfo_cores);
cpuinfo_cores = NULL;
cpuinfo_cores_count = 0;

free(cpuinfo_clusters);
cpuinfo_clusters = NULL;
cpuinfo_clusters_count = 0;

free(cpuinfo_packages);
cpuinfo_packages = NULL;
cpuinfo_packages_count = 0;

for (int lvl = 0; lvl < cpuinfo_cache_level_max; ++lvl) {
free(cpuinfo_cache[lvl]);
cpuinfo_cache[lvl] = NULL;
cpuinfo_cache_count[lvl] = 0;
}
cpuinfo_max_cache_size = 0;

cpuinfo_global_uarch = (struct cpuinfo_uarch_info){0};
}
Loading