Example #1
0
 public bool Deq(ref long Counter, ref Chip Chip, ref EnmDataType Type, ref int Address, ref int Data, ref object ExData)
 {
     return(ringBuffer.Deq(ref Counter, ref Chip, ref Type, ref Address, ref Data, ref ExData));
 }
Example #2
0
        public bool Enq(outDatum od, long Counter, Chip Chip, EnmDataType Type, int Address, int Data, object ExData)
        {
            //if (name != "") mml2vgmIDE.log.Write(
            //    string.Format("[{0}]:Enqueue:Counter:{1}:Model:{2}:Device:{3}:Number:{4}:Type:{5}:Address:{6:x4}:Data:{7:x4}"
            //    , name, Counter, Chip.Model, Chip.Device, Chip.Number, Type, Address, Data));

            lock (lockObj)
            {
                if (enqPos.next == deqPos)
                {
                    //if (!AutoExtend)
                    //{
                    //return false;
                    //}
                    //自動拡張
                    try
                    {
                        CntPackData p = new CntPackData();
                        buf.Add(p);
                        p.prev      = enqPos;
                        p.next      = enqPos.next;
                        enqPos.next = p;
                        p.next.prev = p;
                    }
                    catch
                    {
                        return(false);
                    }
                }

                bLength++;

                //データをセット
                enqPos.Counter = Counter;
                enqPos.pack.Copy(od, Chip, Type, Address, Data, ExData);

                if (Counter >= enqPos.prev.Counter)
                {
                    enqPos = enqPos.next;

                    //debugDispBuffer();

                    return(true);
                }

                CntPackData lastPos = enqPos.prev;
                //サーチ
                long bufCounter = buf.Count + 1;
                srcPos = enqPos.prev;
                while (Counter < srcPos.Counter && srcPos != deqPos && bufCounter > 0)
                {
                    srcPos = srcPos.prev;
                    bufCounter--;
                }

                if (Counter < srcPos.Counter && srcPos == deqPos)
                {
                    srcPos = srcPos.prev;
                    deqPos = enqPos;
                }

                //enqPosをリングから切り出す。
                CntPackData nextPack = enqPos;
                enqPos.prev.next = enqPos.next;
                enqPos.next.prev = enqPos.prev;

                //enqPosを挿入する
                tmpPos      = srcPos.next;
                tmpPos.prev = enqPos;
                srcPos.next = enqPos;
                enqPos.prev = srcPos;
                enqPos.next = tmpPos;

                enqPos = lastPos.next;

                //debugDispBuffer();

                return(true);
            }
        }
Example #3
0
 public bool Enq(long Counter, Chip Chip, EnmDataType Type, int Address, int Data, object ExData)
 {
     return(ringBuffer.Enq(Counter, Chip, Type, Address, Data, ExData));
 }