Ejemplo n.º 1
0
        /// <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
        }
Ejemplo n.º 2
0
        /// <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
        }