void * kmem_get_obj(struct kmem_cache_t *cachep) { struct slab *slabp = NULL; void *obj = NULL; repeat: slabp = kmem_get_slab(cachep); /*printf("slabp = %x.", slabp);*/ obj = slab_get_obj(cachep, slabp); if(obj == NULL) { if(cachep->nr_pages >= pow(2,MAX_SLAB_PAGES)) { return NULL; } else { cache_grow(cachep); goto repeat; } } return obj; }
void * kmem_get_obj(kmem_cache_t *cachep) { struct slab *slabp = NULL; void *obj = NULL; repeat: slabp = kmem_get_slab(cachep); obj = slab_get_obj(cachep, slabp); if(obj) { return obj; } /* get obj is NULL but this kmem_cache_t has free objs */ else { if(obj == NULL && cachep->nr_frees > 0) { return NULL; } else { if(cachep->nr_pages >= pow(2,MAX_SLAB_PAGES)) { return NULL; } else { cache_grow(cachep); goto repeat; } } } return obj; }