static int shrink_caches(zone_t * classzone, int priority, unsigned int gfp_mask, int nr_pages) { int chunk_size = nr_pages; unsigned long ratio; nr_pages -= kmem_cache_reap(gfp_mask); if (nr_pages <= 0) return 0; nr_pages = chunk_size; /* try to keep the active list 2/3 of the size of the cache */ ratio = (unsigned long) nr_pages * nr_active_pages / ((nr_inactive_pages + 1) * 2); refill_inactive(ratio); nr_pages = shrink_cache(nr_pages, classzone, gfp_mask, priority); if (nr_pages <= 0) return 0; shrink_dcache_memory(priority, gfp_mask); shrink_icache_memory(priority, gfp_mask); #ifdef CONFIG_QUOTA shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); #endif return nr_pages; }
const surface tminimap::get_image(const int w, const int h) const { if(!terrain_) { return NULL; } if(terrain_ != terrain) { #ifdef DEBUG_MINIMAP_CACHE std::cerr << "\nFlush cache.\n"; #else DBG_GUI_D << "Flushing the minimap cache.\n"; #endif terrain = terrain_; cache.clear(); } const tkey key(w, h, map_data_); tcache::iterator itor = cache.find(key); if(itor != cache.end()) { #ifdef DEBUG_MINIMAP_CACHE std::cerr << '+'; #endif itor->second.age++; return itor->second.surf; } if(cache.size() >= cache_max_size) { shrink_cache(); } try { const gamemap map(boost::make_shared<terrain_type_data>(*terrain_), map_data_); const surface surf = image::getMinimap(w, h, map, NULL); cache.insert(std::make_pair(key, tvalue(surf))); #ifdef DEBUG_MINIMAP_CACHE std::cerr << '-'; #endif return surf; } catch(incorrect_map_format_error& e) { ERR_CF << "Error while loading the map: " << e.message << '\n'; #ifdef DEBUG_MINIMAP_CACHE std::cerr << 'X'; #endif } return NULL; }
static int shrink_caches(zone_t * classzone, unsigned int gfp_mask, int nr_pages, int * failed_swapout) { nr_pages -= kmem_cache_reap(gfp_mask); if (nr_pages <= 0) goto out; spin_lock(&pagemap_lru_lock); refill_inactive(nr_pages, classzone); nr_pages = shrink_cache(nr_pages, classzone, gfp_mask, failed_swapout); out: return nr_pages; }