Ejemplo n.º 1
0
Archivo: slab.c Proyecto: kubinux/cubix
void kmem_cache_free(struct kmem_cache *cache, void *object)
{
    struct page *page = mm_page_from_virt((uintptr_t)object);
    page = get_head_page(page);
    ASSERT_MSG(cache == page->slab_cache,
               "attempt to free object from another cache");
    add_free_object(page, object);
    if (page->num_allocated == 0)
    {
        list_remove(&cache->partial_slabs, page);
        free_pages(page, cache->pages_per_slab);
    }
    else if (page->num_allocated == cache->num_objects - 1)
    {
        list_prepend(&cache->partial_slabs, page);
    }
    else
    {
        struct page *next_page = list_next(&cache->partial_slabs, page);
        if (next_page && (next_page->num_allocated > page->num_allocated))
        {
            list_remove(&cache->partial_slabs, page);
            list_insert(&cache->partial_slabs, next_page, page);
        }
    }
}
Ejemplo n.º 2
0
void CLevelSpawnConstructor::load_objects						()
{
	// loading spawn points
	string_path					file_name;
	FS.update_path				(file_name,"$game_levels$",*m_level.name());
	strcat_s					(file_name,"\\level.spawn");
	IReader						*level_spawn = FS.r_open(file_name);
	u32							id;
	IReader						*chunk = level_spawn->open_chunk_iterator(id);
	for ( ; chunk; chunk = level_spawn->open_chunk_iterator(id,chunk)) {
		CSE_Abstract			*abstract = create_object(chunk);
		if (abstract->m_tClassID == CLSID_AI_GRAPH) {
			add_graph_point		(abstract);
			continue;
		}

//		if (abstract->m_tClassID == CLSID_AI_SPAWN_GROUP) {
//			add_spawn_group		(abstract);
//			continue;
//		}

		if (!abstract->m_gameType.MatchType(eGameIDSingle)) 
		{
			F_entity_Destroy	(abstract);
			continue;
		}

		CSE_ALifeObject			*alife_object = smart_cast<CSE_ALifeObject*>(abstract);
		if (!alife_object) {
			F_entity_Destroy	(abstract);
			continue;
		}

		CSE_ALifeCreatureActor	*actor = smart_cast<CSE_ALifeCreatureActor*>(alife_object);
		if (actor) {
			R_ASSERT3			(!m_actor,"Too many actors on the level ",*m_level.name());
			m_actor				= actor;
		}

		m_spawns.push_back		(alife_object);

		CSE_ALifeDynamicObject	*dynamic_object = smart_cast<CSE_ALifeDynamicObject*>(alife_object);
		if (dynamic_object) {
			add_story_object	(dynamic_object);
			add_space_restrictor(dynamic_object);
		}

		if (smart_cast<CSE_ALifeLevelChanger*>(abstract))
			add_level_changer	(abstract);

//		if (xr_strlen(alife_object->m_spawn_control))
//			add_group_object	(alife_object,alife_object->m_spawn_control);

		add_free_object			(alife_object);
	}
	
	FS.r_close					(level_spawn);

	R_ASSERT2					(!m_spawns.empty(),"There are no spawn-points!");
}
Ejemplo n.º 3
0
Archivo: slab.c Proyecto: kubinux/cubix
static void init_slab(struct page *page, struct kmem_cache *cache)
{
    page->flags = PG_HEAD;
    page->slab_cache = cache;
    page->num_allocated = cache->num_objects;
    page->free_objects = NULL;
    void *object = (void *)mm_page_to_virt(page);
    for (size_t i = 0; i < cache->num_objects;
         ++i, object += cache->object_size)
    {
        add_free_object(page, object);
    }
    for (size_t idx = 1; idx < cache->pages_per_slab; ++idx)
    {
        page[idx].flags = PG_CONT;
        page[idx].head_page = page;
    }
}