struct item * slab_get_item(uint8_t cid) { rstatus_t status; struct slabclass *c; struct slabinfo *sinfo; struct slab *slab; ASSERT(cid >= SLABCLASS_MIN_ID && cid < nctable); c = &ctable[cid]; if (itemx_empty()) { status = slab_evict(); if (status != FC_OK) { return NULL; } } if (!TAILQ_EMPTY(&c->partial_msinfoq)) { return _slab_get_item(cid); } if (!TAILQ_EMPTY(&free_msinfoq)) { /* move memory slab from free to partial q */ sinfo = TAILQ_FIRST(&free_msinfoq); ASSERT(nfree_msinfoq > 0); nfree_msinfoq--; TAILQ_REMOVE(&free_msinfoq, sinfo, tqe); /* init partial sinfo */ TAILQ_INSERT_HEAD(&c->partial_msinfoq, sinfo, tqe); /* sid is already initialized by slab_init */ /* addr is already initialized by slab_init */ sinfo->nalloc = 0; sinfo->nfree = 0; sinfo->cid = cid; /* mem is already initialized by slab_init */ ASSERT(sinfo->mem == 1); /* init slab of partial sinfo */ slab = slab_from_maddr(sinfo->addr, false); slab->magic = SLAB_MAGIC; slab->cid = cid; /* unused[] is left uninitialized */ slab->sid = sinfo->sid; /* data[] is initialized on-demand */ return _slab_get_item(cid); } ASSERT(!TAILQ_EMPTY(&full_msinfoq)); ASSERT(nfull_msinfoq > 0); status = slab_drain(); if (status != FC_OK) { return NULL; } return slab_get_item(cid); }
struct item * slab_get_item(uint8_t id) { struct item *it; ASSERT(id >= SLABCLASS_MIN_ID && id <= profile_last_id); it = _slab_get_item(id); return it; }