public void CancelEven()
        {
            var bal   = new BinaryAsyncLock(true);
            var cts   = new CancellationTokenSource();
            var task1 = bal.ResetAsync();
            var task2 = bal.ResetAsync(cts.Token);
            var task3 = bal.ResetAsync(cts.Token);
            var task4 = bal.WaitAsync();
            var task5 = bal.WaitAsync(cts.Token);

            task1.Should().BeRanToCompletion();
            task2.Should().NotBeCompleted();
            task3.Should().NotBeCompleted();
            task4.Should().NotBeCompleted();
            task5.Should().NotBeCompleted();

            cts.Cancel();
            task1.Should().BeRanToCompletion();
            task2.Should().BeCanceled();
            task3.Should().BeCanceled();
            task4.Should().NotBeCompleted();
            task5.Should().BeCanceled();

            task1.Result.Reset();
            task1.Should().BeRanToCompletion();
            task2.Should().BeCanceled();
            task3.Should().BeCanceled();
            task4.Should().BeRanToCompletion();
            task5.Should().BeCanceled();

            bal.IsSet.Should().BeFalse();
        }
        public void SequentalWaitReset_SetToken()
        {
            var bal   = new BinaryAsyncLock(true);
            var task1 = bal.ResetAsync();
            var task2 = bal.WaitAsync();
            var task3 = bal.ResetAsync();
            var task4 = bal.WaitAsync();
            var task5 = bal.ResetAsync();

            task1.Should().BeRanToCompletion();
            task2.Should().NotBeCompleted();
            task3.Should().NotBeCompleted();
            task4.Should().NotBeCompleted();
            task5.Should().NotBeCompleted();
            bal.IsSet.Should().BeFalse();

            task1.Result.Set();

            task1.Should().BeRanToCompletion();
            task2.Should().BeRanToCompletion();
            task3.Should().BeRanToCompletion();
            task4.Should().NotBeCompleted();
            task5.Should().NotBeCompleted();
            bal.IsSet.Should().BeFalse();

            task3.Result.Set();

            task1.Should().BeRanToCompletion();
            task2.Should().BeRanToCompletion();
            task3.Should().BeRanToCompletion();
            task4.Should().BeRanToCompletion();
            task5.Should().BeRanToCompletion();
            bal.IsSet.Should().BeFalse();
        }
Exemple #3
0
 public RPackageManagerViewModel(IRPackageManager packageManager, ICoreShell coreShell)
 {
     _packageManager            = packageManager;
     _coreShell                 = coreShell;
     _availableAndInstalledLock = new BinaryAsyncLock();
     _items = new BatchObservableCollection <object>();
     Items  = new ReadOnlyObservableCollection <object>(_items);
 }
        public void WaitAsync_ResetAsync()
        {
            var bal   = new BinaryAsyncLock();
            var task1 = bal.WaitAsync();
            var task2 = bal.ResetAsync();

            task1.Should().BeRanToCompletion();
            task2.Should().NotBeCompleted();
            bal.IsSet.Should().BeFalse();
        }
        public void CancelResetAsync_Set()
        {
            var bal   = new BinaryAsyncLock(true);
            var cts   = new CancellationTokenSource();
            var tasks = Enumerable.Range(0, 4).Select(i => bal.ResetAsync(cts.Token)).ToList();

            tasks.Should().ContainSingle(t => t.IsCompleted);

            cts.Cancel();
            tasks.Should().OnlyContain(t => t.IsCompleted);
        }
        public void CancelWaitAsync_Set()
        {
            var bal   = new BinaryAsyncLock(true);
            var cts   = new CancellationTokenSource();
            var tasks = Enumerable.Range(0, 4).Select(i => bal.WaitAsync(cts.Token)).ToList();

            tasks.Should().OnlyContain(t => t.Status == TaskStatus.RanToCompletion);

            cts.Cancel();
            tasks.Should().OnlyContain(t => t.Status == TaskStatus.RanToCompletion);
        }
        public void ResetAsync_WaitAsync_SetIfLast()
        {
            var bal   = new BinaryAsyncLock();
            var task1 = bal.ResetAsync();
            var task2 = bal.WaitAsync();

            task1.Result.SetIfLast();

            task1.Should().BeRanToCompletion();
            task2.Should().BeRanToCompletion();
            bal.IsSet.Should().BeFalse();
        }
        public void ResetAsync_ResetAsyncCanceled_WaitAsync()
        {
            var bal = new BinaryAsyncLock(true);
            var cts = new CancellationTokenSource();

            cts.Cancel();
            var task1 = bal.ResetAsync(cts.Token);
            var task2 = bal.WaitAsync();

            task1.Should().BeCanceled();
            task2.Should().BeRanToCompletion();
            bal.IsSet.Should().BeTrue();
        }
        public void ResetAsync_ResetAsync_Set_Set()
        {
            var bal   = new BinaryAsyncLock();
            var task1 = bal.ResetAsync();
            var task2 = bal.ResetAsync();

            task1.Result.Set();
            task2.Result.Set();

            task1.Should().BeRanToCompletion();
            task2.Should().BeRanToCompletion();
            bal.IsSet.Should().BeTrue();
        }
Exemple #10
0
        public async Task WaitAsync_SetInCtor()
        {
            var bal   = new BinaryAsyncLock(true);
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                await bal.WaitAsync();
                if (!bal.IsSet)
                {
                    await Task.Delay(50);
                    Interlocked.Increment(ref count);
                }
            });

            count.Should().Be(0);
        }
Exemple #11
0
        public async Task Release()
        {
            var bal   = new BinaryAsyncLock();
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                var isSet = await bal.WaitAsync();
                if (!isSet)
                {
                    Interlocked.Increment(ref count);
                    bal.Release();
                }
            });

            count.Should().Be(1);
        }
Exemple #12
0
        public async Task WaitAsync_Reset()
        {
            var bal   = new BinaryAsyncLock();
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                var token = await bal.WaitAsync();
                if (!bal.IsSet)
                {
                    await Task.Delay(50);
                    Interlocked.Increment(ref count);
                    token.Reset();
                }
            });

            count.Should().Be(4);
        }
        public RPackageManagerViewModel(IRPackageManager packageManager, IRSession session, IRSettings settings, ICoreShell coreShell)
        {
            _packageManager         = packageManager;
            _session                = session;
            _settings               = settings;
            _coreShell              = coreShell;
            _selectedTab            = SelectedTab.None;
            _availablePackages      = new List <IRPackageViewModel>();
            _installedPackages      = new List <IRPackageViewModel>();
            _loadedPackages         = new List <IRPackageViewModel>();
            _availableLock          = new BinaryAsyncLock();
            _installedAndLoadedLock = new BinaryAsyncLock();
            _items         = new BatchObservableCollection <object>();
            _errorMessages = new Queue <string>();
            Items          = new ReadOnlyObservableCollection <object>(_items);

            _session.Mutated += RSessionMutated;
        }
        public RPackageManagerViewModel(IRPackageManager packageManager, IRSettings settings, ICoreShell coreShell)
        {
            _packageManager         = packageManager;
            _settings               = settings;
            _coreShell              = coreShell;
            _selectedTab            = Tab.None;
            _availablePackages      = new List <IRPackageViewModel>();
            _installedPackages      = new List <IRPackageViewModel>();
            _loadedPackages         = new List <IRPackageViewModel>();
            _availableLock          = new BinaryAsyncLock();
            _installedAndLoadedLock = new BinaryAsyncLock();
            _items         = new BatchObservableCollection <object>();
            _errorMessages = new ErrorMessageCollection(this);
            Items          = new ReadOnlyObservableCollection <object>(_items);

            _packageManager.AvailablePackagesInvalidated += AvailablePackagesInvalidated;
            _packageManager.InstalledPackagesInvalidated += InstalledPackagesInvalidated;
            _packageManager.LoadedPackagesInvalidated    += LoadedPackagesInvalidated;
        }
Exemple #15
0
        public async Task Reset()
        {
            var bal   = new BinaryAsyncLock();
            var count = 0;
            await ParallelTools.InvokeAsync(4, async i => {
                try {
                    var isSet = await bal.WaitAsync();
                    if (!isSet)
                    {
                        await Task.Delay(50);
                        bal.Reset();
                    }
                } catch (OperationCanceledException) {
                    Interlocked.Increment(ref count);
                }
            });

            count.Should().Be(3);
        }
Exemple #16
0
        public RSession(int id, IBrokerClient brokerClient, Action onDispose)
        {
            Id            = id;
            BrokerClient  = brokerClient;
            _onDispose    = onDispose;
            _disposeToken = DisposeToken.Create <RSession>();
            _disableMutatingOnReadConsole = new CountdownDisposable(() => {
                if (!_delayedMutatedOnReadConsole)
                {
                    return;
                }

                _delayedMutatedOnReadConsole = false;
                Task.Run(() => Mutated?.Invoke(this, EventArgs.Empty));
            });

            _initializationLock   = new BinaryAsyncLock();
            _initializationTcs    = new TaskCompletionSourceEx <object>();
            _afterHostStartedTask = TaskUtilities.CreateCanceled(new RHostDisconnectedException());
        }
Exemple #17
0
        public void ResetIfNotWaiting_ResetAsync_Skip_WaitAsync_Set()
        {
            var bal  = new BinaryAsyncLock();
            var task = bal.ResetAsync();

            task.Should().BeRanToCompletion();
            bal.IsSet.Should().BeFalse();

            task.Result.Reset();

            bal.IsSet.Should().BeFalse();

            task = bal.WaitAsync();

            task.Should().BeRanToCompletion();
            bal.IsSet.Should().BeFalse();

            task.Result.Set();

            bal.IsSet.Should().BeTrue();
        }
        public RPackageManagerViewModel(IRPackageManager packageManager, IServiceContainer services)
        {
            _packageManager = packageManager;
            _services       = services;
            _settings       = services.GetService <IRSettings>();
            _mainThread     = services.MainThread();

            _selectedTab            = Tab.None;
            _availablePackages      = new List <IRPackageViewModel>();
            _installedPackages      = new List <IRPackageViewModel>();
            _loadedPackages         = new List <IRPackageViewModel>();
            _availableLock          = new BinaryAsyncLock();
            _installedAndLoadedLock = new BinaryAsyncLock();
            _items         = new BatchObservableCollection <object>();
            _errorMessages = new ErrorMessageCollection(this);
            Items          = new ReadOnlyObservableCollection <object>(_items);

            _packageManager.AvailablePackagesInvalidated += AvailablePackagesInvalidated;
            _packageManager.InstalledPackagesInvalidated += InstalledPackagesInvalidated;
            _packageManager.LoadedPackagesInvalidated    += LoadedPackagesInvalidated;
        }
Exemple #19
0
        public RSession(int id, string name, IBrokerClient brokerClient, IExclusiveReaderLock initializationLock, Action onDispose)
        {
            Id            = id;
            Name          = name;
            BrokerClient  = brokerClient;
            _onDispose    = onDispose;
            _disposeToken = DisposeToken.Create <RSession>();
            _disableMutatingOnReadConsole = new CountdownDisposable(() => {
                if (!_delayedMutatedOnReadConsole)
                {
                    return;
                }

                _delayedMutatedOnReadConsole = false;
                Task.Run(() => Mutated?.Invoke(this, EventArgs.Empty));
            });

            _initializationLock = initializationLock;
            _stopHostLock       = new BinaryAsyncLock(true);
            _hostStartedTcs     = new TaskCompletionSourceEx <object>();
            _startupInfo        = new RHostStartupInfo();
        }