예제 #1
0
파일: Program.cs 프로젝트: lwes/lwes-dotnet
        static void Main(string[] args)
        {
            var arguments = new Arguments(args);

            bool userChoseToExit = false;
            int eventCount = 0, incomingCount = 0;
            Event mostRecent = default(Event);
            SimpleLockFreeQueue<Event> writeQ = null;
            var fileName = arguments["f"];

            if (!String.IsNullOrEmpty(fileName))
            {
                writeQ = new SimpleLockFreeQueue<Event>();
                var dir = Path.GetDirectoryName(fileName);
                if (!String.IsNullOrEmpty(dir) && !Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }

                // Start the file writer...
                ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
                {
                    using (var f = File.CreateText(fileName))
                    {
                        while (!userChoseToExit)
                        {
                            Event ev;
                            while (writeQ.TryDequeue(out ev))
                            {
                                f.Write(ev.ToString(true));
                            }
                            Thread.Sleep(200);
                        }
                    }
                }));
            }

            using (IEventListener listener = EventListener.CreateDefault())
            {
                Console.WriteLine("LWES EventListener -\r\n  This console will continue to queue and print LWES events until\r\n  the user types 'exit' followed by a carriage return.");

                listener.OnEventArrived += (sender, ev) =>
                    {
                        Thread.MemoryBarrier();
                        mostRecent = ev;
                        Thread.MemoryBarrier();
                        if (writeQ != null) writeQ.Enqueue(ev);
                        Interlocked.Increment(ref incomingCount);
                    };

                ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
                {
                    while (!userChoseToExit)
                    {
                        Thread.Sleep(2000);
                        if (eventCount < Thread.VolatileRead(ref incomingCount))
                        {
                            eventCount = Thread.VolatileRead(ref incomingCount);
                            Thread.MemoryBarrier();
                            Event mr = mostRecent;
                            Thread.MemoryBarrier();
                            Console.WriteLine(mr.ToString(true));
                            Console.WriteLine("Events received: {0}. Type 'exit' and hit the <return> key to exit.", eventCount.ToString("N0"));
                        }
                    }
                }));

                string input;
                do
                {
                    input = Console.ReadLine();
                } while (!String.Equals(input, "exit", StringComparison.CurrentCultureIgnoreCase));

                userChoseToExit = true;
            }
            Thread.Sleep(200);
            Console.WriteLine("Final event count: {0}", incomingCount.ToString("N0"));
            Thread.Sleep(2000);
        }
예제 #2
0
        public void RoundTripLwesSerializationOfRandomlyGeneratedEvents()
        {
            var t = new { EventsToGenerate = 10000, MaxNumberOfAttributes = 36, Encoding = SupportedEncoding.ISO_8859_1 };

            int totalNumberOfAttributes = 0;

            // Serialization requires an IEventTemplateDB, we're gonna mock it here...
            var mock = new Mock<IEventTemplateDB>();
            Event dummy;
            mock.Setup(db => db.TryCreateEvent(String.Empty, out dummy, false, t.Encoding))
                .Returns(false);

            SimpleLockFreeQueue<Event> serializationQueue = new SimpleLockFreeQueue<Event>();
            SimpleLockFreeQueue<Event> comparisonQueue = new SimpleLockFreeQueue<Event>();
            int serializationCount = 0;
            SimpleLockFreeQueue<byte[]> dataQueue = new SimpleLockFreeQueue<byte[]>();
            SimpleLockFreeQueue<Event> deserializationQueue = new SimpleLockFreeQueue<Event>();
            int deserializationCount = 0;
            long totalByteCount = 0;

            Stopwatch timer = Stopwatch.StartNew();
            ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
                {
                    for (int i = 0; i < t.EventsToGenerate; i++)
                    {
                        Event original = EventUtils.GenerateRandomEvent(String.Concat("MyEvent_", i), t.MaxNumberOfAttributes, t.Encoding);
                        totalNumberOfAttributes += original.AttributeCount;
                        serializationQueue.Enqueue(original);
                    }
                }
                ));

            ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
                {
                    Event original;
                    while (serializationCount < t.EventsToGenerate)
                    {
                        if (serializationQueue.TryDequeue(out original))
                        {
                            byte[] data = LwesSerializer.Serialize(original);
                            dataQueue.Enqueue(data);
                            serializationCount++;
                        }
                    }
                }
                ));

            byte[] buffer;
            while (deserializationCount < t.EventsToGenerate)
            {
                if (dataQueue.TryDequeue(out buffer))
                {
                    totalByteCount += buffer.Length;
                    Event copy = LwesSerializer.Deserialize(buffer, 0, buffer.Length, mock.Object);
                    deserializationCount++;
                }
                else Thread.Sleep(0);
            }

            timer.Stop();

            Console.Write(String.Concat("Generated ", t.EventsToGenerate, " events in ", timer.Elapsed
                , " which is ", (t.EventsToGenerate / timer.ElapsedMilliseconds), " per millisecond and "
                , (totalNumberOfAttributes / timer.ElapsedMilliseconds), " attributes per millisecond.",
                Environment.NewLine, (totalByteCount / timer.Elapsed.TotalSeconds).ToString("N00"), " bytes per second"));
        }
예제 #3
0
            /// <summary>
            /// Starts the listener.
            /// </summary>
            /// <param name="db">an event template DB</param>
            /// <param name="listenEP">the listening endpoint</param>
            /// <param name="finishSocket">a callback method that is called upon to finish the listening socket</param>
            /// <param name="owner">the owner</param>
            public void Start(IEventTemplateDB db
                , IPEndPoint listenEP
                , Action<Socket, IPEndPoint> finishSocket
                , EventListenerBase owner)
            {
                this.TraceData(TraceEventType.Verbose, "EventListenerBase.ParallelListener - Starting");

                _db = db;
                _listener = owner;
                _anyEP = (listenEP.AddressFamily == AddressFamily.InterNetworkV6)
                    ? new IPEndPoint(IPAddress.IPv6Any, 0)
                    : new IPEndPoint(IPAddress.Any, 0);

                _receiveQueue = new SimpleLockFreeQueue<ReceiveCapture>();

                _listenEP = new UdpEndpoint(listenEP).Initialize(finishSocket);
                ParallelReceiver();
                this.TraceData(TraceEventType.Verbose, () =>
                {
                    return new object[] { String.Concat("EventListenerBase.ParallelListener - Started state: ", _listenerState.CurrentState) };
                });
            }
예제 #4
0
        public void RoundTripDotNetSerializationOfRandomlyGeneratedEvents()
        {
            // DotNet serializer will cause OutOfMemoryException if we try to serialize a million
            var t = new { EventsToGenerate = 10000, MaxNumberOfAttributes = 36, Encoding = SupportedEncoding.ISO_8859_1 };

            int totalNumberOfAttributes = 0;

            // Serialization requires an IEventTemplateDB, we're gonna mock it here...
            var mock = new Mock<IEventTemplateDB>();
            Event dummy;
            mock.Setup(db => db.TryCreateEvent(String.Empty, out dummy, false, SupportedEncoding.Default))
                .Returns(false);

            SimpleLockFreeQueue<Event> serializationQueue = new SimpleLockFreeQueue<Event>();
            SimpleLockFreeQueue<Event> comparisonQueue = new SimpleLockFreeQueue<Event>();
            int serializationCount = 0;
            SimpleLockFreeQueue<byte[]> dataQueue = new SimpleLockFreeQueue<byte[]>();
            SimpleLockFreeQueue<Event> deserializationQueue = new SimpleLockFreeQueue<Event>();
            int deserializationCount = 0;
            long totalByteCount = 0;

            IFormatter serializer = new BinaryFormatter();
            IFormatter deserializer = new BinaryFormatter();
            Exception err = null;

            Stopwatch timer = Stopwatch.StartNew();
            ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
            {
                for (int i = 0; i < t.EventsToGenerate && err == null; i++)
                {
                    Event original = EventUtils.GenerateRandomEvent(String.Concat("MyEvent_", i), t.MaxNumberOfAttributes, t.Encoding);
                    totalNumberOfAttributes += original.AttributeCount;
                    serializationQueue.Enqueue(original);
                }
            }
                ));

            ThreadPool.QueueUserWorkItem(new WaitCallback((s) =>
            {
                Event original;
                try
                {
                    while (serializationCount < t.EventsToGenerate && err == null)
                    {
                        if (serializationQueue.TryDequeue(out original))
                        {
                            using (MemoryStream data = new MemoryStream(400))
                            {
                                serializer.Serialize(data, original);
                                dataQueue.Enqueue(data.GetBuffer());
                                totalByteCount += (data.Position + 1);
                            }
                            serializationCount++;
                        }
                    }
                }
                catch (Exception e)
                {
                    err = e;
                }
            }
                ));

            byte[] buffer;
            try
            {
                while (deserializationCount < t.EventsToGenerate && err == null)
                {
                    if (dataQueue.TryDequeue(out buffer))
                    {
                        using (MemoryStream data = new MemoryStream(buffer))
                        {
                            Event copy = (Event)deserializer.Deserialize(data);
                        }
                        deserializationCount++;
                    }
                    else Thread.Sleep(0);
                }
            }
            catch (Exception e)
            {
                err = e;
            }
            if (err != null) throw err;

            timer.Stop();

            Console.Write(String.Concat("Generated ", t.EventsToGenerate, " events in ", timer.Elapsed
                , " which is ", (t.EventsToGenerate / timer.ElapsedMilliseconds), " per millisecond and "
                , (totalNumberOfAttributes / timer.ElapsedMilliseconds), " attributes per millisecond.",
                Environment.NewLine, (totalByteCount / timer.Elapsed.TotalSeconds).ToString("N00"), " bytes per second"));
        }