示例#1
0
文件: slab.c 项目: kubinux/cubix
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;
}
示例#2
0
文件: headers.c 项目: gitpan/ponie
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;
}
示例#3
0
文件: headers.c 项目: gitpan/ponie
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;
}
示例#4
0
文件: object.c 项目: chain78/none
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;
}
示例#5
0
文件: headers.c 项目: gitpan/ponie
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;
}