static void Main(string[] args)
        {
            Console.WriteLine("Is Server GC: " + GCSettings.IsServerGC);
            GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
            Console.WriteLine("Compaction mode: " + GCSettings.LargeObjectHeapCompactionMode);
            Console.WriteLine("Latency mode: " + GCSettings.LatencyMode);
            GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;
            Console.WriteLine("New Latency mode: " + GCSettings.LatencyMode);

            _token = _cancellationTokenSrc.Token;

            var ringBuffer = new ByteRingBuffer(_token);

            const int mod = 37;
            var producerBuffer = new byte[256];
            for (int j = 0; j < producerBuffer.Length; j++)
            {
                producerBuffer[j] = (byte)(j % mod);
            }

            ulong iterations = 50000000L;
            ulong totalExpected = (ulong)(iterations * (ulong)producerBuffer.Length);

            var watch = Stopwatch.StartNew();

            var producerTask = Task.Factory.StartNew(() =>
            {
                ulong totalWritten = 0L;

                for (ulong i = 0L; i < iterations; i += 1)
                {
                    ringBuffer.Write(producerBuffer, 0, producerBuffer.Length);
                    totalWritten += (ulong)producerBuffer.Length;
                }

                Console.WriteLine("Done: written " + totalWritten);
            });

            var temp = new byte[2048];

            var consumerTask = Task.Factory.StartNew(() =>
            {
                ulong totalRead = 0L;
                while (true)
                {
                    var read = ringBuffer.Read(temp, 0, temp.Length);
                    totalRead += (ulong)read;

                    if (totalRead == totalExpected)
                    {
                        break;
                    }
                }
                Console.WriteLine("Done too. Read " + totalRead);
            });

            Task.WaitAll(producerTask, consumerTask);

            Console.WriteLine("Completed in " + watch.Elapsed.TotalMilliseconds + "ms");
        }
Example #2
0
        public SocketConsumer(Socket socket, ByteRingBuffer ringBuffer,
                              CancellationToken cancellationToken, int index)
        {
            _socket            = socket;
            _ringBuffer        = ringBuffer;
            _cancellationToken = cancellationToken;

            ThreadFactory.CreateBackgroundThread(WriteSocketFromRingBuffer, "SocketConsumer_" + index);
        }
        public SocketProducer(Socket socket, ByteRingBuffer ringBuffer, 
							  CancellationToken cancellationToken, int index)
        {
            _socket = socket;
            _ringBuffer = ringBuffer;
            _cancellationToken = cancellationToken;

            ThreadFactory.CreateBackgroundThread(ReadSocketIntoRingBuffer, "SocketProducer_" + index);
        }
        public SocketProducer(Socket socket, ByteRingBuffer ringBuffer,
                              CancellationToken cancellationToken, int index)
        {
            _socket            = socket;
            _ringBuffer        = ringBuffer;
            _cancellationToken = cancellationToken;

            ThreadFactory.BackgroundThread(ReadSocketIntoRingBuffer, "SocketProducer_" + index);
        }
        public SocketConsumer(Socket socket, ByteRingBuffer ringBuffer,
							  CancellationToken cancellationToken, int index)
        {
            _socket = socket;
            _ringBuffer = ringBuffer;
            _cancellationToken = cancellationToken;

            ThreadFactory.CreateBackgroundThread(WriteSocketFromRingBuffer, "SocketConsumer_" + index);
        }
 public RingBufferStreamReadBarrier(RingBufferStreamAdapter innerStream, int length)
 {
     _ringBuffer = innerStream._ringBuffer;
     if (!_ringBuffer.TryAddReadingGate((uint)length, out _gate))
     {
         Console.WriteLine("Could not add reading gate?");
         throw new InvalidOperationException("Could not add reading gate?");
     }
     _length = length;
 }
 public RingBufferStreamAdapter(ByteRingBuffer ringBuffer)
 {
     _ringBuffer = ringBuffer;
 }
 internal RingBufferStreamAdapter(ByteRingBuffer ringBuffer)
 {
     _ringBuffer = ringBuffer;
 }
 public RingBufferStreamReadBarrier(RingBufferStreamAdapter innerStream, int length)
 {
     _ringBuffer = innerStream._ringBuffer;
     // _length = length;
     _gate = _ringBuffer.AddReadingGate((uint)length);
 }
 internal RingBufferStreamAdapter(ByteRingBuffer ringBuffer)
 {
     _ringBuffer = ringBuffer;
 }
 public RingBufferStreamReadBarrier(RingBufferStreamAdapter innerStream, int length)
 {
     _ringBuffer = innerStream._ringBuffer;
     // _length = length;
     _gate = _ringBuffer.AddReadingGate((uint)length);
 }