From 53e2bc461e73487be1c5ed457730deeaae2db2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Thu, 24 Oct 2019 10:00:39 +0200 Subject: [PATCH 1/2] Fixes VSTS Bug 985666: [FATAL] SigAbrt exception in LibGit2Sharp.dll!LibGit2Sharp.Core.Handles.RepositoryHandle::Free+0 https://devdiv.visualstudio.com/DevDiv/_workitems/edit/985666 --- .../GitRepository.cs | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index 05db51bee62..3796780eba9 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -285,6 +285,7 @@ void ThawEvents () FileService.ThawEvents (); } + object repositoryDisposeLock = new object (); protected override void Dispose (bool disposing) { if (IsDisposed) @@ -296,20 +297,24 @@ protected override void Dispose (bool disposing) gitLock?.Dispose (); if (rootRepository != null) { DedicatedOperationFactory.StartNew (() => { - try { - rootRepository?.Dispose (); - } catch (Exception e) { - LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); - } - if (cachedSubmodules != null) { - foreach (var submodule in cachedSubmodules) { - if (submodule?.Item2 != null) { - try { - submodule?.Item2.Dispose (); - } catch (Exception e) { - LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); + lock (repositoryDisposeLock) { + try { + rootRepository?.Dispose (); + rootRepository = null; + } catch (Exception e) { + LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); + } + if (cachedSubmodules != null) { + foreach (var submodule in cachedSubmodules) { + if (submodule?.Item2 != null) { + try { + submodule?.Item2.Dispose (); + } catch (Exception e) { + LoggingService.LogInternalError ("Disposing LibGit2Sharp.Repository failed", e); + } } } + cachedSubmodules = null; } } }).Wait (); @@ -322,8 +327,6 @@ protected override void Dispose (bool disposing) base.Dispose (disposing); watcher = null; - rootRepository = null; - cachedSubmodules = null; } public override string[] SupportedProtocols { From a72a3c2e5e8b4b68020bdb775d0b98db0c08157c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 8 Nov 2019 10:48:31 +0100 Subject: [PATCH 2/2] [VersionControl] Added an disposed check to DedicatedOperationFactory --- .../MonoDevelop.VersionControl.Git/GitRepository.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index 3796780eba9..8bcb8b55fa8 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -93,6 +93,8 @@ DedicatedThreadScheduler GitScheduler { TaskFactory DedicatedOperationFactory { get { + if (rootRepository == null) + throw new ObjectDisposedException ("This object is disposed."); if (dedicatedOperationFactory == null) dedicatedOperationFactory = new TaskFactory (GitScheduler); return dedicatedOperationFactory;