/// <summary> /// insert this segment into cache, kick out other if needed /// </summary> /// <param name="seg"></param> /// <precondition>seg is a new page brought in memory</precondition> /// <postcondition>seg is insert into the cache, and the front of the LRU list, kick out one page if needed.</postcondition> internal void _put_in_cache(Segment seg) { //if the cache is full, kick least recently used one out if (m_cache.Count > m_cacheLimit) { //pick least recently used one Segment victim = m_LRU.Prev; Debug.Assert(victim != m_LRU); if (victim.Dirty) { _write_back(victim); } victim.BreakLinks(); bool t = m_cache.Delete(victim.SegmentID); //removed this one out of the cache Debug.Assert(t); } if (m_cache.Insert(seg) == false) { throw new OOD.Exception.ProgramLogicError( this, "Trying to insert an existing key into CacheHashtable"); } seg.BuildLinks(m_LRU, m_LRU.Next); //move it the front of the LRU list }
/// <summary> /// insert this segment into cache, kick out other if needed /// </summary> /// <param name="seg"></param> /// <precondition>seg is a new page brought in memory</precondition> /// <postcondition>seg is insert into the cache, and the front of the LRU list, kick out one page if needed.</postcondition> internal void _put_in_cache(Segment seg) { //if the cache is full, kick least recently used one out if (m_cache.Count > m_cacheLimit) { //pick least recently used one Segment victim = m_LRU.Prev; Debug.Assert(victim != m_LRU); if (victim.Dirty) { //write it out to the disk byte[] content = victim.Serialize(); Debug.Assert(content.Length <= m_pageSize); m_diskFile.SynWrite(content, 0, victim.SegmentID * m_pageSize, content.Length); } victim.BreakLinks(); bool t = m_cache.Delete(victim.SegmentID); //removed this one out of the cache Debug.Assert(t); } if (m_cache.Insert(seg) == false) { throw new OOD.Exception.ProgramLogicError( this, "Trying to insert a existing key into CacheHashtable."); } seg.BuildLinks(m_LRU, m_LRU.Next); //move it the front of the LRU list }