public void WhenAReadOperationIsBeingPerformed_ThenWritesAreNotProcessedUntilTheReadOperationIsDone()
        {
            var lastUpdate = "none";
            var readSync = new AutoResetEvent(false);
            var writeSync = new AutoResetEvent(false);
            var barrier = new Barrier(2);

            ThreadPool.QueueUserWorkItem((o) =>
            {
                readSync.WaitOne(2000);
                this.coordinator.ExecuteReadOperation(() =>
                {
                    writeSync.Set();
                    Thread.Sleep(1000);
                    lastUpdate = "read";
                });
                barrier.Await();
            });

            readSync.Set();
            writeSync.WaitOne(2000);
            this.coordinator.ExecuteWriteOperation(() =>
            {
                lastUpdate = "write";
            });
            barrier.Await();

            Assert.AreEqual("write", lastUpdate);
        }
Exemple #2
0
        public void WhenAReadOperationIsBeingPerformed_ThenWritesAreNotProcessedUntilTheReadOperationIsDone()
        {
            var lastUpdate = "none";
            var readSync   = new AutoResetEvent(false);
            var writeSync  = new AutoResetEvent(false);
            var barrier    = new Barrier(2);

            ThreadPool.QueueUserWorkItem((o) =>
            {
                readSync.WaitOne(2000);
                this.coordinator.ExecuteReadOperation(() =>
                {
                    writeSync.Set();
                    Thread.Sleep(1000);
                    lastUpdate = "read";
                });
                barrier.Await();
            });

            readSync.Set();
            writeSync.WaitOne(2000);
            this.coordinator.ExecuteWriteOperation(() =>
            {
                lastUpdate = "write";
            });
            barrier.Await();

            Assert.AreEqual("write", lastUpdate);
        }
Exemple #3
0
        public void WhenConfigurationChangeEventSourceRaisesItsEvent_ThenTheUpdateHandlerCommitsAreGuardedByTheWriterLock()
        {
            var lastUpdate = "none";
            var updateSync = new AutoResetEvent(false);
            var readSync   = new AutoResetEvent(false);
            var barrier    = new Barrier(2);

            var updateHandler = new Mock <ILoggingUpdateHandler>();

            updateHandler.Setup(h => h.CommitUpdate(It.IsAny <object>()))
            .Callback(() =>
            {
                readSync.Set();
                Thread.Sleep(1000);
                lastUpdate = "config update";
            });

            this.coordinator.RegisterLoggingUpdateHandler(updateHandler.Object);

            ThreadPool.QueueUserWorkItem((o) =>
            {
                updateSync.WaitOne(2000);

                this.source.OnSectionChanged <LoggingSettings>(
                    new SectionChangedEventArgs <LoggingSettings>(new LoggingSettings(), this.locator));

                barrier.Await();
            });

            updateSync.Set();
            readSync.WaitOne(2000);
            this.coordinator.ExecuteReadOperation(() =>
            {
                lastUpdate = "read";
            });

            barrier.Await();

            Assert.AreEqual("read", lastUpdate);
        }
        public void WhenConfigurationChangeEventSourceRaisesItsEvent_ThenTheUpdateHandlerCommitsAreGuardedByTheWriterLock()
        {
            var lastUpdate = "none";
            var updateSync = new AutoResetEvent(false);
            var readSync = new AutoResetEvent(false);
            var barrier = new Barrier(2);

            var updateHandler = new Mock<ILoggingUpdateHandler>();
            updateHandler.Setup(h => h.CommitUpdate(It.IsAny<object>()))
                .Callback(() =>
                                {
                                    readSync.Set();
                                    Thread.Sleep(1000);
                                    lastUpdate = "config update";
                                });

            this.coordinator.RegisterLoggingUpdateHandler(updateHandler.Object);

            ThreadPool.QueueUserWorkItem((o) =>
            {
                updateSync.WaitOne(2000);

                this.source.OnSectionChanged<LoggingSettings>(
                    new SectionChangedEventArgs<LoggingSettings>(new LoggingSettings(), this.locator));

                barrier.Await();
            });

            updateSync.Set();
            readSync.WaitOne(2000);
            this.coordinator.ExecuteReadOperation(() =>
            {
                lastUpdate = "read";
            });

            barrier.Await();

            Assert.AreEqual("read", lastUpdate);
        }