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