/* * \brief Least-recently-used cache replacement strategy * \author Stefan Kalkowski * \date 2013-12-05 */ /* * Copyright (C) 2013 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. */ #include #include "lru.h" #include "driver.h" typedef Driver::Chunk_level_4 Chunk; static const Lru_policy::Element *lru = 0; static Genode::List lru_list; static void lru_access(const Lru_policy::Element *e) { if (e == lru) return; if (e->next()) lru_list.remove(e); lru_list.insert(e, lru); lru = e; } void Lru_policy::read(const Lru_policy::Element *e) { lru_access(e); } void Lru_policy::write(const Lru_policy::Element *e) { lru_access(e); } void Lru_policy::flush(Cache::size_t size) { Cache::size_t s = 0; for (Lru_policy::Element *e = lru_list.first(); e && ((size == 0) || (s < size)); e = lru_list.first(), s += sizeof(Chunk)) { Chunk *cb = static_cast(e); e = e->next(); try { cb->free(Driver::CACHE_BLK_SIZE, cb->base_offset()); lru_list.remove(cb); } catch(Chunk::Dirty_chunk &e) { cb->sync(e.size, e.off); } } if (!lru_list.first()) lru = 0; if (s < size) throw Block::Driver::Request_congestion(); }