예제 #1
0
 protected override void Dispose(bool b)
 {
     lock (BufferPool) {
         ByteBuffer.Clear();
         BufferPool[ByteBuffer] = false;
     }
     OverReadLock.Dispose();
     ByteBufferLock.Dispose();
     foreach (Stream s in ParallelWriteStreams)
     {
         s.Dispose();
     }
     foreach (Action a in OnDispose)
     {
         a();
     }
 }
예제 #2
0
        public override void Write(byte[] buffer, int offset, int count)
        {
            if (count <= 0 || offset < 0 || buffer.Length <= 1 || offset > buffer.Length)
            {
                return;
            }

            try {
                ByteBufferLock.WaitOne();
                int    size      = ByteBuffer.Count;
                byte[] subBuffer = buffer.Skip(offset).Take(count).ToArray();
                ByteBuffer.AddRange(subBuffer);
                byte[] cloneBuffer = ByteBuffer.Skip(size).ToArray();
                bool   equal       = subBuffer.Length == cloneBuffer.Length;
                if (equal)
                {
                    for (int i = 0; i < subBuffer.Length; i++)
                    {
                        equal = subBuffer[i] == cloneBuffer[i];
                        if (!equal)
                        {
                            break;
                        }
                    }
                }
                string sub   = Encoding.ASCII.GetString(subBuffer);
                string clone = Encoding.ASCII.GetString(cloneBuffer);
                //ByteBuffer.AddRange(buffer, offset, count);
                InternalWritePointer += count;
                //try {
                //    OverReadLock.Release();
                //} catch { }
            } finally {
                ByteBufferLock.Release();
            }

            foreach (Stream x in ParallelWriteStreams)
            {
                x.Write(buffer, offset, count);
            }
        }
예제 #3
0
        //public override void CopyTo(Stream destination, int bufferSize) {
        //    while(InternalWritePointer < Document.Length) {
        //        if(ByteBuffer.Count <= 0) {
        //            OverReadLock.WaitOne(0);//ensure locked
        //            OverReadLock.WaitOne();
        //        }

        //        try {
        //            ByteBufferLock.WaitOne();
        //            destination.Write(ByteBuffer.InternalArray, 0, ByteBuffer.Count);
        //            ByteBuffer.Clear();
        //        }finally{
        //            ByteBufferLock.Release();
        //        }
        //    }
        //}
        //public override async Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) {
        //    byte[] buffer = new byte[bufferSize];
        //    while(InternalWritePointer < Document.Length || ByteBuffer.Count > 0) {
        //        //if(ByteBuffer.Count <= 0 && InternalWritePointer < Document.Length) {
        //        //    OverReadLock.WaitOne(0);//ensure locked
        //        //    OverReadLock.WaitOne();
        //        //}

        //        try {
        //            ByteBufferLock.WaitOne();
        //            int copy = buffer.Length > ByteBuffer.Count ? ByteBuffer.Count : buffer.Length;
        //            for(int i = 0; i < copy; i++){
        //                buffer[i] = ByteBuffer[i];
        //            }
        //            ByteBuffer.RemoveRange(0, copy);
        //            await destination.WriteAsync(buffer, 0, copy);
        //            //await destination.WriteAsync(ByteBuffer.ToArray(), 0, ByteBuffer.Count);
        //            //await destination.WriteAsync(ByteBuffer.InternalArray, 0, ByteBuffer.Count);
        //            ByteBuffer.Clear();
        //        } finally {
        //            ByteBufferLock.Release();
        //        }
        //    }
        //}

        public override int Read(byte[] buffer, int offset, int count)
        {
            //if(ByteBuffer.Count <= 0 && InternalWritePointer < Document.Length) {
            //    OverReadLock.WaitOne(0);//ensure locked
            //    OverReadLock.WaitOne();
            //}
            try {
                ByteBufferLock.WaitOne();
                if (count > ByteBuffer.Count)
                {
                    count = ByteBuffer.Count;
                }
                for (int i = 0; i < count; i++)
                {
                    buffer[i + offset] = ByteBuffer[i];
                }
                ByteBuffer.RemoveRange(0, count);
                return(count);
            } finally {
                ByteBufferLock.Release();
            }
        }