/// <summary> /// /// </summary> /// <param name="pageid"></param> /// <param name="result"></param> protected override sealed void DoRead(uint pageid, byte[] result) { IRRFrame irrframe; //if not in hash map if (!map.TryGetValue(pageid, out irrframe)) { //add to hash map irrframe = new IRRFrame(pageid, pool.AllocSlot()); map[pageid] = irrframe; //load the page dev.Read(pageid, pool[irrframe.DataSlotId]); pool[irrframe.DataSlotId].CopyTo(result, 0); //add to IRR queue Frame frame = new Frame(pageid); frame.Dirty = false; irrQueue.Enqueue(frame); //(to be added) if the queue exceed a certain threshold, one frame should be kicked off. } else//in hash map { irrframe = map[pageid]; if (!irrframe.Resident) //miss non resident { irrframe.DataSlotId = pool.AllocSlot(); dev.Read(pageid, pool[irrframe.DataSlotId]); pool[irrframe.DataSlotId].CopyTo(result, 0); } //update IRR uint irr = irrQueue.accessIRR(pageid, false); irrframe.ReadIRR = irr; //possiblely 0, no effect if (irr == 0) { Frame frame = new Frame(pageid); frame.Dirty = false; irrQueue.Enqueue(frame); } } }
/// <summary> /// /// </summary> /// <param name="pageid"></param> /// <param name="data"></param> protected override sealed void DoWrite(uint pageid, byte[] data) { IRRFrame irrframe; //if not in hash map if (!map.TryGetValue(pageid, out irrframe)) { //add to hash map irrframe = new IRRFrame(pageid, pool.AllocSlot()); map[pageid] = irrframe; //add to IRR queue Frame frame = new Frame(pageid); frame.Dirty = true; irrQueue.Enqueue(frame); //(to be added) if the queue exceed a certain threshold, one frame should be kicked off. } else//in hash map { irrframe = map[pageid]; if (!irrframe.Resident) //miss non resident allocate a slot { irrframe.DataSlotId = pool.AllocSlot(); } //update IRR uint irr = irrQueue.accessIRR(pageid, true); irrframe.WriteIRR = irr; //0 doesn't matter. if (irr == 0) { Frame frame = new Frame(pageid); frame.Dirty = true; irrQueue.Enqueue(frame); } } irrframe.Dirty = true; data.CopyTo(pool[irrframe.DataSlotId], 0); }