Пример #1
0
        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();
        }
Пример #2
0
        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();
        }
Пример #3
0
        /// <summary>
        /// Starts intellisense session.
        /// </summary>
        public async Task StartSessionAsync(CancellationToken ct = default(CancellationToken))
        {
            var token = await _lock.ResetAsync(ct);

            try {
                if (!_sessionProvider.HasBroker)
                {
                    throw new RHostDisconnectedException();
                }

                if (Session == null)
                {
                    Session = _sessionProvider.GetOrCreate(SessionNames.Intellisense);
                }

                if (!Session.IsHostRunning)
                {
                    int timeout  = _unitTests ? 10000 : 3000;
                    var settings = Services.GetService <IRSettings>();
                    await Session.EnsureHostStartedAsync(new RHostStartupInfo(settings.CranMirror, codePage : settings.RCodePage), null, timeout, ct);
                }
            } finally {
                token.Set();
            }
        }
Пример #4
0
        private async Task UpdateInstalledPackagesAsync(CancellationToken ct = default(CancellationToken))
        {
            if (!_updatePending)
            {
                return;
            }
            var token = await _buildIndexLock.ResetAsync(ct);

            if (!token.IsSet)
            {
                try {
                    var installed = await GetInstalledPackagesAsync(ct);

                    var installedNames = installed.Select(p => p.Package).Concat(new[] { "rtvs" }).ToList();

                    var currentNames = _packages.Keys.ToArray();
                    var removedNames = currentNames.Except(installedNames);
                    _packages.RemoveWhere((kvp) => removedNames.Contains(kvp.Key));

                    var added = installed.Where(p => !currentNames.Contains(p.Package));
                    await AddPackagesToIndexAsync(added, ct);

                    _updatePending = false;
                } catch (RException) { } catch (OperationCanceledException) {
                } finally {
                    token.Reset();
                }
            }
        }
Пример #5
0
        public void ResetAsync_ResetAsync_SetIfLast()
        {
            var bal   = new BinaryAsyncLock();
            var task1 = bal.ResetAsync();
            var task2 = bal.ResetAsync();

            task1.Result.SetIfLast();

            task1.Should().BeRanToCompletion();
            task2.Should().BeRanToCompletion();
            bal.IsSet.Should().BeFalse();
        }
Пример #6
0
        public async Task CreateSessionAsync()
        {
            var token = await _lock.ResetAsync();

            try {
                if (string.IsNullOrEmpty(_sessionProvider.Broker.Name))
                {
                    throw new RHostDisconnectedException();
                }

                if (Session == null)
                {
                    Session = _sessionProvider.GetOrCreate(SessionId);
                }

                if (!Session.IsHostRunning)
                {
                    int timeout = _coreShell.IsUnitTestEnvironment ? 10000 : 3000;
                    await Session.EnsureHostStartedAsync(new RHostStartupInfo {
                        Name           = "IntelliSense",
                        CranMirrorName = RToolsSettings.Current.CranMirror,
                        CodePage       = RToolsSettings.Current.RCodePage
                    }, null, timeout);
                }
            } finally {
                token.Set();
            }
        }
Пример #7
0
        public void ResetAsync_ResetAsync_WaitAsync_CancelSecond_SetFirst()
        {
            var bal = new BinaryAsyncLock(true);
            var cts = new CancellationTokenSource();

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

            cts.Cancel();
            task1.Result.Set();

            task1.Should().BeRanToCompletion();
            task2.Should().BeCanceled();
            task3.Should().BeRanToCompletion();
            bal.IsSet.Should().BeTrue();
        }
Пример #8
0
        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();
        }
Пример #9
0
        private async Task RemovePackagesAsync()
        {
            var token = await _buildIndexLock.ResetAsync();

            if (!token.IsSet)
            {
                try {
                    var installed = await GetInstalledPackagesAsync();

                    var installedNames = installed.Select(p => p.Package).Append("rtvs").ToList();

                    var currentNames = _packages.Keys.ToArray();
                    var removedNames = currentNames.Except(installedNames);
                    _packages.RemoveWhere((kvp) => removedNames.Contains(kvp.Key));
                } catch (RException) { } catch (OperationCanceledException) { } finally {
                    token.Reset();
                }
            }
        }
Пример #10
0
        /// <summary>
        /// Starts intellisense session.
        /// </summary>
        public async Task StartSessionAsync(CancellationToken ct = default(CancellationToken))
        {
            var token = await _lock.ResetAsync(ct);

            try {
                if (Session == null)
                {
                    Session = _sessionProvider.GetOrCreate(SessionNames.Intellisense);
                }

                if (!Session.IsHostRunning)
                {
                    int timeout  = _coreShell.IsUnitTestEnvironment ? 10000 : 3000;
                    var settings = _coreShell.GetService <IRToolsSettings>();
                    await Session.EnsureHostStartedAsync(new RHostStartupInfo(settings.CranMirror, codePage : settings.RCodePage), null, timeout);
                }
            } finally {
                token.Set();
            }
        }
Пример #11
0
        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);
        }
Пример #12
0
        public void WaitAsync_ResetAsync_Set_Set()
        {
            var bal   = new BinaryAsyncLock();
            var task1 = bal.WaitAsync();
            var task2 = bal.ResetAsync();

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

            task1.Should().BeRanToCompletion();
            task2.Should().BeRanToCompletion();
            bal.IsSet.Should().BeTrue();
        }
Пример #13
0
        private async Task RebuildIndexAsync()
        {
            if (!_buildIndexLock.IsSet)
            {
                // Still building, try again later
                ScheduleIdleTimeRebuild();
                return;
            }

            var lockToken = await _buildIndexLock.ResetAsync();

            await BuildIndexAsync(lockToken);
        }
        /// <summary>
        /// Starts intellisense session.
        /// </summary>
        public async Task StartSessionAsync(CancellationToken ct = default)
        {
            var token = await _lock.ResetAsync(ct);

            try {
                if (!_sessionProvider.HasBroker)
                {
                    throw new RHostDisconnectedException();
                }

                if (Session == null)
                {
                    Session = _sessionProvider.GetOrCreate(SessionNames.Intellisense);
                }

                if (!Session.IsHostRunning)
                {
                    var timeout = _unitTests ? 10000 : 3000;
                    await Session.EnsureHostStartedAsync(new RHostStartupInfo(), null, null, timeout, ct);
                }
            } finally {
                token.Set();
            }
        }
Пример #15
0
        private async Task ReloadInstalledAndLoadedPackagesAsync()
        {
            var lockToken = await _installedAndLoadedLock.ResetAsync();

            try {
                if (!lockToken.IsSet)
                {
                    await LoadInstalledAndLoadedPackagesAsync();
                }
            } catch (RPackageManagerException ex) {
                _coreShell.DispatchOnUIThread(() => AddErrorMessage(ex.Message));
            } finally {
                lockToken.Set();
            }
        }
Пример #16
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();
        }
Пример #17
0
        /// <summary>
        /// Starts intellisense session.
        /// </summary>
        public async Task StartSessionAsync()
        {
            var token = await _lock.ResetAsync();

            try {
                if (!_sessionProvider.HasBroker)
                {
                    throw new RHostDisconnectedException();
                }

                if (Session == null)
                {
                    Session = _sessionProvider.GetOrCreate(SessionNames.Intellisense);
                }

                if (!Session.IsHostRunning)
                {
                    int timeout = _coreShell.IsUnitTestEnvironment ? 10000 : 3000;
                    await Session.EnsureHostStartedAsync(new RHostStartupInfo(RToolsSettings.Current.CranMirror, codePage : RToolsSettings.Current.RCodePage), null, timeout);
                }
            } finally {
                token.Set();
            }
        }