uint8_t item_slabid(uint16_t nkey, uint32_t nbyte) { size_t ntotal; uint8_t id; ntotal = item_ntotal(nkey, nbyte); id = slab_id(ntotal); return id; }
/* * Allocate an item. We allocate an item by consuming the next free item * from slab of the item's slab class. * * On success we return the pointer to the allocated item. */ static item_rstatus_e _item_alloc(struct item **it_p, uint8_t klen, uint32_t vlen, uint8_t olen) { uint8_t id = slab_id(item_ntotal(klen, vlen, olen)); struct item *it; log_verb("allocate item with klen %u vlen %u", klen, vlen); *it_p = NULL; if (id == SLABCLASS_INVALID_ID) { return ITEM_EOVERSIZED; } it = slab_get_item(id); *it_p = it; if (it != NULL) { _item_reset(it); slab_ref(item_to_slab(it)); /* slab to be deref'ed in _item_link */ INCR(slab_metrics, item_curr); INCR(slab_metrics, item_alloc); PERSLAB_INCR(id, item_curr); log_verb("alloc it %p of id %"PRIu8" at offset %"PRIu32, it, it->id, it->offset); return ITEM_OK; } else { INCR(slab_metrics, item_alloc_ex); log_warn("server error on allocating item in slab %"PRIu8, id); return ITEM_ENOMEM; } }