Ejemplo n.º 1
0
 public void Dispose()
 {
     if (this.libgit2RepoPool != null)
     {
         this.libgit2RepoPool.Dispose();
         this.libgit2RepoPool = null;
     }
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        public void Dispose()
        {
            if (this.libgit2RepoPool != null)
            {
                this.libgit2RepoPool.Dispose();
                this.libgit2RepoPool = null;
            }

            if (this.GVFSLock != null)
            {
                this.GVFSLock.Dispose();
                this.GVFSLock = null;
            }
        }
Ejemplo n.º 4
0
        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);
        }