void ITraceEnlightenment.AsyncConditionVariable_NotifyAll(AsyncConditionVariable conditionVariable, AsyncLock asyncLock)
 {
     if (IsEnabled(EventLevel.Verbose, Keywords.AsyncSynchronization))
     {
         AsyncConditionVariableNotifyAll(conditionVariable.Id, Task.CurrentId ?? 0, asyncLock.Id);
     }
 }
 void ITraceEnlightenment.AsyncMonitor_Created(AsyncLock asyncLock, AsyncConditionVariable conditionVariable)
 {
     if (IsEnabled(EventLevel.Verbose, Keywords.AsyncSynchronization))
     {
         AsyncMonitorCreated(asyncLock.Id, conditionVariable.Id, Task.CurrentId ?? 0);
     }
 }
        public void Id_IsNotZero()
        {
            var mutex = new AsyncLock();
            var cv    = new AsyncConditionVariable(mutex);

            Assert.AreNotEqual(0, cv.Id);
        }
        public void MultipleWaits_NotifyAll_AllAreCompleted()
        {
            AsyncContext.Run(async() =>
            {
                var mutex = new AsyncLock();
                var cv    = new AsyncConditionVariable(mutex);
                var key1  = await mutex.LockAsync();
                var task1 = cv.WaitAsync();
                var __    = task1.ContinueWith(_ => key1.Dispose());
                var key2  = await mutex.LockAsync();
                var task2 = cv.WaitAsync();
                var ___   = task2.ContinueWith(_ => key2.Dispose());

                await Task.Run(async() =>
                {
                    using (await mutex.LockAsync())
                    {
                        cv.NotifyAll();
                    }
                });

                await task1;
                await task2;
            });
        }
Example #5
0
 internal RpcServer()
 {
     Active        = false;
     m_terminating = false;
     m_lockObject  = new AsyncLock();
     m_callCond    = new AsyncConditionVariable(m_lockObject);
     m_pollCond    = new AsyncConditionVariable(m_lockObject);
 }
 /// <summary>
 /// Constructs a new in-memory stream.
 /// </summary>
 /// <param name="maxBytes">The maximum number of bytes to hold available for reading. Note that due to buffers, the memory usage of this type may be higher than this parameter.</param>
 public ProducerConsumerStream(int maxBytes = int.MaxValue)
 {
     _maxBytes            = maxBytes;
     _data                = new LinkedList <byte[]>();
     _mutex               = new AsyncLock();
     _notFullOrCompleted  = new AsyncConditionVariable(_mutex);
     _notEmptyOrCompleted = new AsyncConditionVariable(_mutex);
     Reader               = new ReaderStream(this);
     Writer               = new WriterStream(this);
 }
        public async Task WaitAsync_WithoutNotify_IsNotCompleted()
        {
            var mutex = new AsyncLock();
            var cv    = new AsyncConditionVariable(mutex);

            await mutex.LockAsync();

            var task = cv.WaitAsync();

            await AsyncAssert.NeverCompletesAsync(task);
        }
        public async Task WaitAsync_WithoutNotify_IsNotCompleted()
        {
            AsyncLock mutex           = new AsyncLock();
            AsyncConditionVariable cv = new AsyncConditionVariable(mutex);

            await mutex.LockAsync();

            Task task = cv.WaitAsync();

            await AsyncAssert.NeverCompletesAsync(task).ConfigureAwait(false);
        }
        public void WaitAsync_WithoutNotify_IsNotCompleted()
        {
            AsyncContext.Run(async() =>
            {
                var mutex = new AsyncLock();
                var cv    = new AsyncConditionVariable(mutex);

                await mutex.LockAsync();
                var task = cv.WaitAsync();

                await AssertEx.NeverCompletesAsync(task);
            });
        }
Example #10
0
        public AsyncCollection(IProducerConsumerCollection <T> collection = null, int maxCount = int.MaxValue)
        {
            if (maxCount <= 0)
            {
                throw new ArgumentOutOfRangeException("maxCount", "The maximum count must be greater than zero.");
            }
            this.collection = collection ?? new ConcurrentQueue <T>();
            this.maxCount   = maxCount;

            mutex    = new AsyncLock();
            notFull  = new AsyncConditionVariable(mutex);
            notEmpty = new AsyncConditionVariable(mutex);
        }
            void ITraceEnlightenment.AsyncConditionVariable_TrackWait(AsyncConditionVariable conditionVariable, AsyncLock asyncLock, Task notifyTask, Task waitTask)
            {
                if (!IsEnabled(EventLevel.Verbose, Keywords.AsyncSynchronization))
                {
                    return;
                }
                var conditionVariableId = conditionVariable.Id;
                var asyncLockId         = asyncLock.Id;
                var notifyTaskId        = notifyTask.Id;
                var waitTaskId          = waitTask.Id;

                AsyncConditionVariableWaitBegin(conditionVariableId, Task.CurrentId ?? 0, asyncLockId, notifyTaskId, waitTaskId);
                waitTask.ContinueWith(t => AsyncConditionVariableWaitEnd(conditionVariableId, Task.CurrentId ?? 0, asyncLockId, notifyTaskId, waitTaskId, t.IsCanceled), TaskContinuationOptions.ExecuteSynchronously);
            }
        /// <summary>
        ///     Create a new <see cref="K8sMultiplexedReadStream"/>.
        /// </summary>
        /// <param name="streamIndex">
        ///     The Kubernetes stream index of the target input stream.
        /// </param>
        /// <param name="maxPendingBytes">
        ///     The maximum number of pending bytes that the stream can hold.
        /// </param>
        /// <param name="loggerFactory">
        ///     The <see cref="ILoggerFactory"/> used to create loggers for client components.
        /// </param>
        public K8sMultiplexedReadStream(byte streamIndex, int maxPendingBytes, ILoggerFactory loggerFactory)
        {
            if (maxPendingBytes < 1)
            {
                throw new ArgumentOutOfRangeException(nameof(maxPendingBytes), maxPendingBytes, "Maximum number of pending bytes cannot be less than 1.");
            }

            _mutex = new AsyncLock();
            _completedOrDataAvailable = new AsyncConditionVariable(_mutex);

            StreamIndex     = streamIndex;
            MaxPendingBytes = maxPendingBytes;
            Log             = loggerFactory.CreateLogger <K8sMultiplexedReadStream>();
        }
        public async Task WaitAsync_AfterNotify_IsNotCompleted()
        {
            var mutex = new AsyncLock();
            var cv    = new AsyncConditionVariable(mutex);
            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.Notify();
                }
            });

            await mutex.LockAsync();

            var task = cv.WaitAsync();

            await AsyncAssert.NeverCompletesAsync(task);
        }
        public async Task WaitAsync_AfterNotify_IsNotCompleted()
        {
            AsyncLock mutex           = new AsyncLock();
            AsyncConditionVariable cv = new AsyncConditionVariable(mutex);
            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.Notify();
                }
            }).ConfigureAwait(false);

            await mutex.LockAsync();

            Task task = cv.WaitAsync();

            await AsyncAssert.NeverCompletesAsync(task).ConfigureAwait(false);
        }
        public async Task WaitAsync_Notified_IsCompleted()
        {
            AsyncLock mutex           = new AsyncLock();
            AsyncConditionVariable cv = new AsyncConditionVariable(mutex);
            await mutex.LockAsync();

            Task task = cv.WaitAsync();

            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.Notify();
                }
            }).ConfigureAwait(false);

            await task;
        }
        public async Task WaitAsync_Notified_IsCompleted()
        {
            var mutex = new AsyncLock();
            var cv    = new AsyncConditionVariable(mutex);
            await mutex.LockAsync();

            var task = cv.WaitAsync();

            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.Notify();
                }
            });

            await task;
        }
        public async Task MultipleWaits_Notify_OneIsCompleted()
        {
            AsyncLock mutex            = new AsyncLock();
            AsyncConditionVariable cv  = new AsyncConditionVariable(mutex);
            IDisposable            key = await mutex.LockAsync();

            Task task1 = cv.WaitAsync();
            Task __    = task1.ContinueWith(_ => key.Dispose());
            await mutex.LockAsync();

            Task task2 = cv.WaitAsync();

            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.Notify();
                }
            }).ConfigureAwait(false);

            await task1;
            await AsyncAssert.NeverCompletesAsync(task2).ConfigureAwait(false);
        }
        public async Task MultipleWaits_Notify_OneIsCompleted()
        {
            var mutex = new AsyncLock();
            var cv    = new AsyncConditionVariable(mutex);
            var key   = await mutex.LockAsync();

            var task1 = cv.WaitAsync();
            var __    = task1.ContinueWith(_ => key.Dispose());
            await mutex.LockAsync();

            var task2 = cv.WaitAsync();

            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.Notify();
                }
            });

            await task1;
            await AsyncAssert.NeverCompletesAsync(task2);
        }
        public async Task MultipleWaits_NotifyAll_AllAreCompleted()
        {
            AsyncLock mutex             = new AsyncLock();
            AsyncConditionVariable cv   = new AsyncConditionVariable(mutex);
            IDisposable            key1 = await mutex.LockAsync();

            Task        task1 = cv.WaitAsync();
            Task        __    = task1.ContinueWith(_ => key1.Dispose());
            IDisposable key2  = await mutex.LockAsync();

            Task task2 = cv.WaitAsync();
            Task ___   = task2.ContinueWith(_ => key2.Dispose());

            await Task.Run(async() =>
            {
                using (await mutex.LockAsync())
                {
                    cv.NotifyAll();
                }
            }).ConfigureAwait(false);

            await task1;
            await task2;
        }