protected override sealed void DoRead(uint pageid, byte[] result) { RWFrame frame = null; //////////////////////////////////by cat if (!map.TryGetValue(pageid, out frame)) { frame = new RWFrame(pageid); map[pageid] = frame; } if (!frame.Resident) { frame.DataSlotId = pool.AllocSlot(); dev.Read(pageid, pool[frame.DataSlotId]); pool[frame.DataSlotId].CopyTo(result, 0); } pool[frame.DataSlotId].CopyTo(result, 0); ////////////////////////////////////////////////////// readList.updateFrame(frame, false); writeList.updateFrame(frame, false); }
protected override sealed void DoWrite(uint pageid, byte[] data) { RWFrame frame = null; if (!map.TryGetValue(pageid, out frame)) { frame = new RWFrame(pageid); map[pageid] = frame; } if (!frame.Resident) { frame.DataSlotId = pool.AllocSlot(); } data.CopyTo(pool[frame.DataSlotId], 0); frame.Dirty = true; ////////////////////////////////////////////////////// readList.updateFrame(frame, true); writeList.updateFrame(frame, true); }
private void updateFrameNode(RWFrame frame, bool isWriteQueue, bool isWriteOperation, LinkedListNode<RWQuery> node) { if (isWriteQueue) { if (isWriteOperation) { frame.NodeOfWriteInWriteQueue = node; } else { frame.NodeOfReadInWriteQueue = node; } } else { if (isWriteOperation) { frame.NodeOfWriteInReadQueue = node; } else { frame.NodeOfReadInReadQueue = node; } } }
private LinkedListNode<RWQuery> getNode(RWFrame frame, bool isWriteQueue, bool isWriteOperation) { if (isWriteQueue) { if (isWriteOperation) { return frame.NodeOfWriteInWriteQueue; } else { return frame.NodeOfReadInWriteQueue; } } else { if (isWriteOperation) { return frame.NodeOfWriteInReadQueue; } else { return frame.NodeOfReadInReadQueue; } } }
public LinkedListNode<RWQuery> updateFrame(RWFrame frame, bool isWrite) { if (getNode(frame, isWriteQueue, isWrite) == null) { return Enqueue(frame, isWrite); } else { return AccessFrame(frame, isWrite); } }
public LinkedListNode<RWQuery> Enqueue(RWFrame frame, bool isWrite) { LinkedListNode<RWQuery> newNode = queue.AddFirst(new RWQuery(frame.Id, isWrite)); updateFrameNode(frame, isWriteQueue, isWrite, newNode); return newNode; }
public LinkedListNode<RWQuery> AccessFrame(RWFrame frame, bool isWrite) { LinkedListNode<RWQuery> node = getNode(frame, isWriteQueue, isWrite); queue.Remove(node); LinkedListNode<RWQuery> newNode = queue.AddFirst(new RWQuery(frame.Id, isWrite)); updateFrameNode(frame, isWriteQueue, node.Value.Type == AccessType.Write, newNode); return newNode; }