public override Segment GetSegment(uint segId, Segment segFactory, object helper) { Debug.Assert(segId >= (m_bitmap.Data.Length >> m_pageBits)); Debug.Assert(m_bitmap.PageFree(segId) == false); if (m_cache.Exists(segId)) { //requested page is in the cache Segment seg = m_cache.Retrive(segId); //update recently used page list, move this one to the front of the list, most recently used. seg.BreakLinks(); seg.BuildLinks(m_LRU, m_LRU.Next); return(seg); } else { //the requested page is not in the cache, read it from disk byte[] content = m_diskFile.SynRead(segId * m_pageSize, m_pageSize); Segment seg = segFactory.Deserialize(segId, helper, content); _put_in_cache(seg); return(seg); } }
public override Segment GetSegment(uint segId, Segment segFactory, object helper) { Debug.Assert(segId >= (m_bitmap.Data.Length >> m_pageBits)); Debug.Assert(m_bitmap.PageFree(segId) == false); if (m_cache.Exists(segId)) { //requested page is in the cache Segment seg = m_cache.Retrive(segId); //update recently used page list, move this one to the front of the list, most recently used. seg.BreakLinks(); seg.BuildLinks(m_LRU, m_LRU.Next); return seg; } else { //the requested page is not in the cache, read it from disk byte[] content = m_diskFile.SynRead(segId*m_pageSize, m_pageSize); Segment seg = segFactory.Deserialize(segId, helper, content); _put_in_cache(seg); return seg; } }
public override Segment GetSegment(uint segId, Segment segFactory, object helper) { Segment result = null; //check if this segment is already in cache if (m_cache.Exists(segId)) { result = m_cache.Retrive(segId); //update the least recently used list result.BreakLinks(); result.BuildLinks(m_LRU, m_LRU.Next); return(result); } else { //if not, read that from disk uint offset = 0; int length = 0; if (m_segTree.GetAddr(segId, ref offset, ref length)) { // put this segment into cache byte[] content = m_diskFile.SynRead(offset, length); result = segFactory.Deserialize(segId, helper, content); _put_in_cache(result); } else { throw new OOD.Exception.ProgramLogicError( this, "Trying to access a non-existing segment."); } return(result); } }
public override Segment GetSegment(uint segId, Segment segFactory, object helper) { Segment result = null; //check if this segment is already in cache if (m_cache.Exists(segId)) { result = m_cache.Retrive(segId); //update the least recently used list result.BreakLinks(); result.BuildLinks(m_LRU, m_LRU.Next); return result; } else { //if not, read that from disk uint offset = 0; int length = 0; if (m_segTree.GetAddr(segId, ref offset, ref length)) { // put this segment into cache byte[] content = m_diskFile.SynRead(offset, length); result = segFactory.Deserialize(segId, helper, content); _put_in_cache(result); } else throw new OOD.Exception.ProgramLogicError( this, "Trying to access a non-existing segment."); return result; } }