public void Dispose() { if (this.libgit2RepoPool != null) { this.libgit2RepoPool.Dispose(); this.libgit2RepoPool = null; } }
public GitRepo(ITracer tracer, Enlistment enlistment, PhysicalFileSystem fileSystem, Func <LibGit2Repo> repoFactory = null) { this.tracer = tracer; this.enlistment = enlistment; this.fileSystem = fileSystem; this.GVFSLock = new GVFSLock(tracer); this.libgit2RepoPool = new LibGit2RepoPool( tracer, repoFactory ?? (() => new LibGit2Repo(this.tracer, this.enlistment.WorkingDirectoryRoot)), Environment.ProcessorCount * 2); }
public void Dispose() { if (this.libgit2RepoPool != null) { this.libgit2RepoPool.Dispose(); this.libgit2RepoPool = null; } if (this.GVFSLock != null) { this.GVFSLock.Dispose(); this.GVFSLock = null; } }
public void PoolReallocatesRepos() { MockTracer tracer = new MockTracer(); int size = 3; TimeSpan dueTime = TimeSpan.FromMilliseconds(1); TimeSpan period = TimeSpan.FromMilliseconds(1); BlockingCollection <object> threadReady = new BlockingCollection <object>(); BlockingCollection <object> threadTriggers = new BlockingCollection <object>(); BlockingCollection <object> disposalTriggers = new BlockingCollection <object>(); using (LibGit2RepoPool pool = new LibGit2RepoPool(tracer, () => new MockLibGit2Repo(disposalTriggers), size, dueTime, period)) { for (int i = 0; i < size; i++) { new Thread(() => pool.TryInvoke( repo => { threadReady.TryAdd(new object(), 0); return(threadTriggers.TryTake(out object _, 5000)); }, out bool result)).Start(); threadReady.TryTake(out object _, 5000); } for (int i = 0; i < size; i++) { threadReady.TryTake(out object _, 5000); threadTriggers.TryAdd(new object(), 0); disposalTriggers.TryTake(out object _, millisecondsTimeout: 5000).ShouldBeTrue(); } pool.TryInvoke(repo => true, out bool invoked); invoked.ShouldBeTrue(); disposalTriggers.TryTake(out object _, millisecondsTimeout: 5000).ShouldBeTrue(); } disposalTriggers.TryTake(out object _, millisecondsTimeout: 0).ShouldBeFalse(); tracer.RelatedWarningEvents.Count.ShouldEqual(0); }