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); } } }
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!"); }
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; } }