< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Runtime.AsyncManualResetEvent
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Runtime/AsyncManualResetEvent.cs
Line coverage
82%
Covered lines: 28
Uncovered lines: 6
Coverable lines: 34
Total lines: 91
Line coverage: 82.3%
Branch coverage
65%
Covered branches: 13
Total branches: 20
Branch coverage: 65%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
WaitAsync()100%11100%
WaitAsync()66.66%6675%
TokenCancelledCallback(...)0%220%
Set()50%22100%
Reset()83.33%6685.71%
CheckDisposed()50%2266.66%
Dispose()50%22100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Runtime/AsyncManualResetEvent.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Threading;
 6using System.Threading.Tasks;
 7
 8namespace CoreWCF.Runtime
 9{
 10    // This class is based on the blog post https://blogs.msdn.microsoft.com/pfxteam/2012/02/11/building-async-coordinat
 11    // move this to common folder - TODO Biroj
 12    public class AsyncManualResetEvent : IDisposable
 13    {
 236214        private TaskCompletionSource<bool> _tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsy
 15
 16        public Task WaitAsync()
 17        {
 263018            CheckDisposed();
 263019            return _tcs.Task;
 20        }
 21
 22        public async Task<bool> WaitAsync(CancellationToken token)
 23        {
 4424            CheckDisposed();
 25
 4426            if (!token.CanBeCanceled)
 27            {
 4328                await WaitAsync();
 4329                return true;
 30            }
 31
 132            if (token.IsCancellationRequested)
 33            {
 034                return false;
 35            }
 36
 137            var localTcs = new TaskCompletionSource<bool>();
 138            using (token.Register(TokenCancelledCallback, localTcs))
 39            {
 140                TaskCompletionSource<bool> tcs = _tcs;
 141                CheckDisposed();
 142                return await await Task.WhenAny(localTcs.Task, tcs.Task);
 43            }
 4444        }
 45
 46        private static void TokenCancelledCallback(object obj)
 47        {
 048            var localTcs = obj as TaskCompletionSource<bool>;
 049            localTcs?.TrySetResult(false);
 050        }
 51
 52        public void Set()
 53        {
 963454            CheckDisposed();
 963455            _tcs?.TrySetResult(true);
 963456        }
 57
 58        public void Reset()
 59        {
 263060            CheckDisposed();
 61            while (true)
 62            {
 263163                TaskCompletionSource<bool> tcs = _tcs;
 263164                if (tcs == null)
 65                {
 066                    return; // Disposed
 67                }
 68
 263169                if (!tcs.Task.IsCompleted ||
 263170                Interlocked.CompareExchange(ref _tcs, new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuation
 71                {
 263072                    return;
 73                }
 74            }
 75        }
 76
 77        private void CheckDisposed()
 78        {
 1493979            if (_tcs == null)
 80            {
 081                throw new ObjectDisposedException(nameof(AsyncManualResetEvent));
 82            }
 1493983        }
 84
 85        public void Dispose()
 86        {
 4487            TaskCompletionSource<bool> tcs = Interlocked.Exchange(ref _tcs, null);
 4488            tcs?.TrySetResult(false);
 4489        }
 90    }
 91}