void print_slab_clock(unsigned int id) { int i; slabclass_t *p; p = &slabclass[id]; for (i = 0; i < p->clock_max; i++) { if (bv_getbit(p->bitmap, i) == 0) DBG_INFO(DBG_ASSOC_HOPSCOTCH, "0"); else DBG_INFO(DBG_ASSOC_HOPSCOTCH, "1"); } DBG_INFO(DBG_ASSOC_HOPSCOTCH, "\n"); }
item* slabs_cache_evict(unsigned int id) { slabclass_t *p; p = &slabclass[id]; size_t max_steps = 10; bool foundzero = false; //size_t clock = rand() % p->clock_max; // slow search until we reach the end of a byte assert(p->clock < p->clock_max); while ((p->clock & 0x7) != 0) { if (bv_getbit(p->bitmap, p->clock)) { bv_setbit(p->bitmap, p->clock, 0); } else { bv_setbit(p->bitmap, p->clock, 1); foundzero = true; break; } p->clock ++; if (p->clock >= p->clock_max) break; } if (!foundzero) { if (p->clock + 64 >= p->clock_max) p->clock = 0; uint64_t *val64 = (uint64_t* ) ((char*) (p->bitmap) + p->clock / 8); for (size_t steps = 0; steps < max_steps; steps ++) { if (*val64 == (uint64_t) -1) { *val64 = 0; val64 ++; p->clock += 64; if (p->clock + 64 >= p->clock_max) p->clock = 0; continue; } else { // only works for little endian uint32_t *val32 = (uint32_t*) val64; if (*val32 == (uint32_t) -1) { *val32 = 0; val32 ++; p->clock += 32; } uint16_t *val16 = (uint16_t*) val32; if (*val16 == (uint16_t) -1) { *val16 = 0; val16 ++; p->clock += 16; } uint8_t *val8 = (uint8_t*) val16; if (*val8 == (uint8_t) -1) { *val8 = 0; val8 ++; p->clock += 8; } //k = *val8; //*val8 &= 1 << k; p->clock += firstzero[*val8]; //printf("val8 %d\n", *val8); bv_setbit(p->bitmap, p->clock, 1); break; } } } p->clock = (p->clock > p->clock_max) ? 0 : p->clock; bv_setbit(p->bitmap, p->clock, 1); assert(p->clock < p->clock_max); //printf("pos%u\n", p->clock); //fflush(stdout); size_t index = p->clock / p->perslab; size_t offset = p->clock % p->perslab; p->clock ++; return (item*) ((char*) (p->slab_list[index]) + p->size * offset); }
item *slabs_cache_evict(unsigned int id) { size_t max_steps = 10, index, offset, steps; bool foundzero = false; uint64_t *val64; uint32_t *val32; uint16_t *val16; uint8_t *val8; item *ret_item; slabclass_t *p; p = &slabclass[id]; // slow search until we reach the end of a byte assert(p->clock < p->clock_max); while ((p->clock & 0x7) != 0) { if (bv_getbit(p->bitmap, p->clock) == 1) { bv_setbit(p->bitmap, p->clock, 0); } else { bv_setbit(p->bitmap, p->clock, 1); foundzero = 0; break; } p->clock++; if (p->clock >= p->clock_max) break; } if (!foundzero) { if (p->clock + 64 >= p->clock_max) p->clock = 0; val64 = (uint64_t *)((char *)(p->bitmap) + p->clock / 8); for (steps = 0; steps < max_steps; steps++) { if (*val64 == (uint64_t)-1) { *val64 = 0; val64++; p->clock += 64; if (p->clock + 64 >= p->clock_max) p->clock = 0; } else { val32 = (uint32_t *)val64; if (*val32 == (uint32_t)-1) { *val32 = 0; val32++; p->clock += 32; } val16 = (uint16_t *)val32; if (*val16 == (uint16_t)-1) { *val16 = 0; val16++; p->clock += 16; } val8 = (uint8_t *)val16; if (*val8 == (uint8_t)-1) { *val8 = 0; val8++; p->clock += 8; } p->clock += firstzero[*val8]; bv_setbit(p->bitmap, p->clock, 1); break; } } } p->clock = (p->clock > p->clock_max) ? 0 : p->clock; bv_setbit(p->bitmap, p->clock, 1); assert(p->clock < p->clock_max); index = p->clock / p->perslab; offset = p->clock % p->perslab; p->clock++; ret_item = (item *)((char *)(p->slab_list[index]) + p->size * offset); return ret_item; }