57 lines
2.0 KiB
C
57 lines
2.0 KiB
C
|
|
#ifndef HAKMEM_SHARED_POOL_INTERNAL_H
|
||
|
|
#define HAKMEM_SHARED_POOL_INTERNAL_H
|
||
|
|
|
||
|
|
#include "hakmem_shared_pool.h"
|
||
|
|
#include "hakmem_tiny_superslab.h"
|
||
|
|
#include "hakmem_tiny_superslab_constants.h"
|
||
|
|
#include <stdatomic.h>
|
||
|
|
#include <pthread.h>
|
||
|
|
|
||
|
|
// Global Shared Pool Instance
|
||
|
|
extern SharedSuperSlabPool g_shared_pool;
|
||
|
|
|
||
|
|
// Lock Statistics
|
||
|
|
// Counters are defined always to avoid compilation errors in Release build
|
||
|
|
// (usage is guarded by g_lock_stats_enabled which is 0 in Release)
|
||
|
|
extern _Atomic uint64_t g_lock_acquire_count;
|
||
|
|
extern _Atomic uint64_t g_lock_release_count;
|
||
|
|
extern _Atomic uint64_t g_lock_acquire_slab_count;
|
||
|
|
extern _Atomic uint64_t g_lock_release_slab_count;
|
||
|
|
extern int g_lock_stats_enabled;
|
||
|
|
|
||
|
|
#if !HAKMEM_BUILD_RELEASE
|
||
|
|
void lock_stats_init(void);
|
||
|
|
#else
|
||
|
|
static inline void lock_stats_init(void) {
|
||
|
|
// No-op for release build
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
// Stage Statistics
|
||
|
|
extern _Atomic uint64_t g_sp_stage1_hits[TINY_NUM_CLASSES_SS];
|
||
|
|
extern _Atomic uint64_t g_sp_stage2_hits[TINY_NUM_CLASSES_SS];
|
||
|
|
extern _Atomic uint64_t g_sp_stage3_hits[TINY_NUM_CLASSES_SS];
|
||
|
|
extern int g_sp_stage_stats_enabled;
|
||
|
|
void sp_stage_stats_init(void);
|
||
|
|
|
||
|
|
// Internal Helpers (Shared between acquire/release/pool)
|
||
|
|
void shared_pool_ensure_capacity_unlocked(uint32_t min_capacity);
|
||
|
|
SuperSlab* sp_internal_allocate_superslab(void);
|
||
|
|
|
||
|
|
// Slot & Meta Helpers
|
||
|
|
int sp_slot_mark_active(SharedSSMeta* meta, int slot_idx, int class_idx);
|
||
|
|
int sp_slot_mark_empty(SharedSSMeta* meta, int slot_idx);
|
||
|
|
int sp_slot_claim_lockfree(SharedSSMeta* meta, int class_idx);
|
||
|
|
SharedSSMeta* sp_meta_find_or_create(SuperSlab* ss);
|
||
|
|
void sp_meta_sync_slots_from_ss(SharedSSMeta* meta, SuperSlab* ss);
|
||
|
|
|
||
|
|
// Free List Helpers
|
||
|
|
int sp_freelist_push_lockfree(int class_idx, SharedSSMeta* meta, int slot_idx);
|
||
|
|
int sp_freelist_pop_lockfree(int class_idx, SharedSSMeta** meta_out, int* slot_idx_out);
|
||
|
|
|
||
|
|
// Policy & Geometry Helpers
|
||
|
|
uint32_t sp_class_active_limit(int class_idx);
|
||
|
|
void sp_fix_geometry_if_needed(SuperSlab* ss, int slab_idx, int class_idx);
|
||
|
|
|
||
|
|
#endif // HAKMEM_SHARED_POOL_INTERNAL_H
|