Пример #1
0
void slabs_cache_update(item* it) {

    slabclass_t *p;
    unsigned int id;

    id = it->slabs_clsid;
    if (id > POWER_SMALLEST && id < power_largest) {

        p = &slabclass[id];
        size_t pos = ((char*) it - (char*) mem_base) / p->size;
        assert(pos < p->clock_max);
        bv_setbit(p->bitmap, pos, 1);
    }
}
Пример #2
0
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);
    
}
Пример #3
0
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;
}