BlockBuffer *MRUBlockManager::MakeBlockResident(ArrayIndex p_BlockNumber, ArrayIndex &p_OldBufferNumber) { ArrayIndex i; ArrayIndex EarliestStamp; time_t TimeStamp; if (m_BlockNumber[p_OldBufferNumber] == p_BlockNumber) { m_TimeStamp[p_OldBufferNumber] = time(NULL); return m_BlockBuffer[p_OldBufferNumber]; } for (i = 0; i < m_BlockNumber.GetSize(); i ++) { if (m_BlockNumber[i] == p_BlockNumber) { m_TimeStamp[i] = time(NULL); return m_BlockBuffer[i]; } } TimeStamp = WayInTheFuture; for (i = 0; i < m_TimeStamp.GetSize(); i ++) { if (m_TimeStamp[i] < TimeStamp) // find the earliest timestamp { TimeStamp = m_TimeStamp[i]; EarliestStamp = i; } } if (m_BufferModified[EarliestStamp]) /* it needs to be written out */ Write(EarliestStamp); // set block number of new occupant m_BlockNumber[EarliestStamp] = p_BlockNumber; m_BufferModified[EarliestStamp] = FALSE; // not modified yet m_TimeStamp[EarliestStamp] = time(NULL); Read(EarliestStamp); p_OldBufferNumber = EarliestStamp; return m_BlockBuffer[EarliestStamp]; }