void *kmem_cache_alloc(struct kmem_cache *cache, uint32_t flags) { struct page *page = list_first(&cache->partial_slabs); if (!page) { page = make_new_slab(cache); if (!page) { return NULL; } list_append(&cache->partial_slabs, page); } void *result = get_free_object(page); if (page->num_allocated == cache->num_objects) { list_remove(&cache->partial_slabs, page); } else { struct page *prev_page = list_prev(&cache->partial_slabs, page); if (prev_page && (prev_page->num_allocated < page->num_allocated)) { list_remove(&cache->partial_slabs, prev_page); list_insert(&cache->partial_slabs, page, prev_page); } } if (flags & KMEM_ZEROED) { memset(result, 0, cache->object_size); } return result; }
static PARROT_INLINE PMC_EXT * new_pmc_ext(struct Parrot_Interp *interpreter) { struct Small_Object_Pool *pool = interpreter->arena_base->pmc_ext_pool; void *ptr = get_free_object(interpreter, pool); memset(ptr, 0, sizeof(PMC_EXT)); return ptr; }
void * get_free_buffer(struct Parrot_Interp *interpreter, struct Small_Object_Pool *pool) { Buffer *buffer = get_free_object(interpreter, pool); memset(buffer, 0, pool->object_size); SET_NULL(buffer->bufstart); return buffer; }
Object *cloneObject(Object *obj){ object_t od = getFreeObject(); if(0 != od){ Object *o = get_free_object(); /*! panic bug !*/ if(o){ memcpy(o,obj,PAGE_SIZE); object_table[od] = o; o->id = od; return o; } } return NULL; }
void * get_free_pmc(struct Parrot_Interp *interpreter, struct Small_Object_Pool *pool) { PMC *pmc = get_free_object(interpreter, pool); /* clear flags, set is_PMC_FLAG */ PObj_flags_SETTO(pmc, PObj_is_PMC_FLAG); #if ! PMC_DATA_IN_EXT PMC_data((PMC *)pmc) = NULL; #endif ((PMC *)pmc)->pmc_ext = NULL; /* TODO check PMCs init method, if they clear the cache */ return pmc; }