void WriterNodeMove()
 {
     if (Node.Next == null)                                                   //next block is null
     {
         if (ByteBlockBuffer.LinkedList.First != ByteBlockBuffer.Reader.Node) //give priority to reuse block from beginning
         {
             Node = ByteBlockBuffer.LinkedList.First;
         }
         else //create new block
         {
             ByteBlockBuffer.LinkedList.AddAfter(Node, ByteBlockBuffer.CreateBlock());
             Node = Node.Next;
         }
     }
     else //next block is exist
     {
         if (Node.Next == ByteBlockBuffer.Reader.Node) //all blocks are occupied, create a new one
         {
             ByteBlockBuffer.LinkedList.AddAfter(Node, ByteBlockBuffer.CreateBlock());
             Node = Node.Next;
         }
         else //reuse block
         {
             Node = Node.Next;
         }
     }
 }
Exemple #2
0
 /// <summary>
 /// how many bytes you have read out
 /// used to move postion
 /// </summary>
 /// <param name="length"></param>
 public void MovePosition(int length)
 {
     lock (Locker)
     {
         Position += length;
         if (Position > ByteBlockBuffer.Size)
         {
             throw new Exception("Reader position error");
         }
         if (ByteBlockBuffer.IsReaderAndWriterInSameNode())
         {
             if (Position > ByteBlockBuffer.Writer.Position)
             {
                 throw new Exception(
                           "When in same node, Reader's position must not large than Writer's postion");
             }
         }
         if (Position == ByteBlockBuffer.Size) //current block have already read finish
         {
             Position = 0;
             ReaderNodeMove();
         }
     }
 }