46 lines
1.3 KiB
C
46 lines
1.3 KiB
C
|
|
// Box: Slab Management (Bitmap Operations)
|
||
|
|
// Purpose: Slab bitmap manipulation within SuperSlab
|
||
|
|
|
||
|
|
#include "ss_slab_management_box.h"
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// Slab Bitmap Management
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
void superslab_activate_slab(SuperSlab* ss, int slab_idx) {
|
||
|
|
if (!ss || slab_idx < 0 || slab_idx >= ss_slabs_capacity(ss)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
uint32_t mask = 1u << slab_idx;
|
||
|
|
if ((ss->slab_bitmap & mask) == 0) {
|
||
|
|
ss->slab_bitmap |= mask;
|
||
|
|
ss->active_slabs++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void superslab_deactivate_slab(SuperSlab* ss, int slab_idx) {
|
||
|
|
if (!ss || slab_idx < 0 || slab_idx >= ss_slabs_capacity(ss)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
uint32_t mask = 1u << slab_idx;
|
||
|
|
if (ss->slab_bitmap & mask) {
|
||
|
|
ss->slab_bitmap &= ~mask;
|
||
|
|
ss->active_slabs--;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int superslab_find_free_slab(SuperSlab* ss) {
|
||
|
|
if (!ss) return -1;
|
||
|
|
if ((int)ss->active_slabs >= ss_slabs_capacity(ss)) {
|
||
|
|
return -1; // No free slabs
|
||
|
|
}
|
||
|
|
// Find first 0 bit in bitmap
|
||
|
|
int cap = ss_slabs_capacity(ss);
|
||
|
|
for (int i = 0; i < cap; i++) {
|
||
|
|
if ((ss->slab_bitmap & (1u << i)) == 0) {
|
||
|
|
return i;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return -1;
|
||
|
|
}
|