#include <lru.h>
shttl::lru_list< key_type, pointer_type >に対する継承グラフ
Public 型 | |
typedef std::vector< element_type > | array_type |
typedef array_type::iterator | iterator |
typedef replacer< key_type >::size_type | size_type |
Public メソッド | |
void | construct (const size_type set_num, const size_type way_num) |
lru_list () | |
size_type | size () |
size_type | target (const size_type index) |
void | touch (const size_type index, const size_type way, const key_type key) |
Protected メソッド | |
void | erase (iterator set, iterator cur) |
iterator | get_footer (const size_type index) |
iterator | get_set (const size_type index) |
void | insert (iterator set, iterator pos, iterator cur) |
void | reset_set (size_type index) |
Protected 変数 | |
array_type | m_array |
size_t | m_pitch |
size_t | m_set_num |
size_t | m_way_num |
構成 | |
struct | element_type |
typedef std::vector<element_type> shttl::lru_list< key_type, pointer_type >::array_type |
typedef array_type::iterator shttl::lru_list< key_type, pointer_type >::iterator |
shttl::lru_list< key_type, pointer_type >::lru_list | ( | ) | [inline] |
void shttl::lru_list< key_type, pointer_type >::construct | ( | const size_type | set_num, | |
const size_type | way_num | |||
) | [inline] |
00338 { 00339 m_way_num = way_num; 00340 m_set_num = set_num; 00341 m_pitch = way_num + 1; 00342 size_t size = set_num * m_pitch; 00343 00344 if( std::numeric_limits<pointer_type>().max() <= m_pitch ){ 00345 throw std::invalid_argument( 00346 "shttl::lru_list() \n The specified way number is too large." 00347 ); 00348 } 00349 00350 m_array.resize( size ); 00351 00352 for( size_t i = 0; i < set_num; i++ ){ 00353 reset_set( i ); 00354 } 00355 00356 }
void shttl::lru_list< key_type, pointer_type >::erase | ( | iterator | set, | |
iterator | cur | |||
) | [inline, protected] |
参照元 shttl::lru_list< key_type >::touch().
00444 { 00445 iterator prev = set + cur->prev; 00446 iterator next = set + cur->next; 00447 prev->next = cur->next; 00448 next->prev = cur->prev; 00449 }
Here is the caller graph for this function:
iterator shttl::lru_list< key_type, pointer_type >::get_footer | ( | const size_type | index | ) | [inline, protected] |
iterator shttl::lru_list< key_type, pointer_type >::get_set | ( | const size_type | index | ) | [inline, protected] |
参照元 shttl::lru_list< key_type >::get_footer()・shttl::lru_list< key_type >::reset_set()・shttl::lru_list< key_type >::touch().
00401 { 00402 size_t offset = index * m_pitch; 00403 00404 // LRU information of each cache set consists of a list with 'm_way_num + 1' ways. 00405 // (m_pitch = m_way_num + 1 00406 // The last entry in each list is a footer pointing an LRU entry. 00407 // 00408 // An example of 4-way array: 00409 // set-0: | way-0 | way-1 | way-2 | way-3 | footer | 00410 // set-1: | way-0 | way-1 | way-2 | way-3 | footer | 00411 // set-2: ... 00412 00413 return m_array.begin() + offset; 00414 }
Here is the caller graph for this function:
void shttl::lru_list< key_type, pointer_type >::insert | ( | iterator | set, | |
iterator | pos, | |||
iterator | cur | |||
) | [inline, protected] |
参照元 shttl::lru_list< key_type >::touch().
00453 { 00454 iterator prev = set + pos->prev; 00455 cur->prev = pos->prev; 00456 cur->next = (pointer_type)(pos - set); 00457 prev->next = (pointer_type)(cur - set); 00458 pos->prev = (pointer_type)(cur - set); 00459 }
Here is the caller graph for this function:
void shttl::lru_list< key_type, pointer_type >::reset_set | ( | size_type | index | ) | [inline, protected] |
参照元 shttl::lru_list< key_type >::construct().
00424 { 00425 // LRU <--------------------> MRU 00426 // 0 1 2 3 m_way_num 00427 // |-> way-0 -> way-1 -> way-2 -> way-3 -> footer ->| 00428 // ^ | 00429 // ^------------------------------------------------| 00430 00431 iterator set = get_set( index ); 00432 00433 for( size_t i = 0; i < m_way_num + 1; i++ ){ 00434 ( set + i )->prev = (pointer_type)(i - 1); 00435 ( set + i )->next = (pointer_type)(i + 1); 00436 } 00437 00438 (set + 0)->prev = (pointer_type)m_way_num; 00439 (set + m_way_num)->next = (pointer_type)0; 00440 }
Here is the caller graph for this function:
size_type shttl::lru_list< key_type, pointer_type >::size | ( | ) | [inline] |
参照元 shttl::lru_list< key_type >::construct().
00359 { 00360 return m_set_num; 00361 }
Here is the caller graph for this function:
size_type shttl::lru_list< key_type, pointer_type >::target | ( | const size_type | index | ) | [inline] |
void shttl::lru_list< key_type, pointer_type >::touch | ( | const size_type | index, | |
const size_type | way, | |||
const key_type | key | |||
) | [inline] |
00369 { 00370 iterator set = get_set( index ); 00371 iterator cur = set + way; 00372 00373 // Erase 'cur' from list. 00374 erase( set, cur ); 00375 00376 // Insert 'cur' before a footer. 00377 insert( 00378 set, 00379 set + m_way_num, // This is a footer 00380 cur 00381 ); 00382 00383 // Array&Pointer Image List Image 00384 // way-0 way-1 way-2 way-3 footer 00385 // initial : [4,1] [0,2] [1,3] [2,4] [3,0] / w0 -> w1 -> w2 -> w3 -> footer -> w0(LRU) 00386 // touch 0 : [3,4] [4,2] [1,3] [2,0] [0,1] / w1 -> w2 -> w3 -> w0 -> footer -> w1(LRU) 00387 // touch 3 : [2,3] [4,2] [1,0] [0,4] [3,1] / w1 -> w2 -> w0 -> w3 -> footer -> w1(LRU) 00388 // ^ 00389 // LRU 00390 00391 }
array_type shttl::lru_list< key_type, pointer_type >::m_array [protected] |
size_t shttl::lru_list< key_type, pointer_type >::m_pitch [protected] |
size_t shttl::lru_list< key_type, pointer_type >::m_set_num [protected] |
size_t shttl::lru_list< key_type, pointer_type >::m_way_num [protected] |