X-Git-Url: http://andersk.mit.edu/gitweb/svn-all-fast-export.git/blobdiff_plain/25e6c28e0da95faa8bd6644cebf3f20d0afb6f53..374d4cd6fe492af4bcb0adf46e380f55be737d01:/src/repository.cpp diff --git a/src/repository.cpp b/src/repository.cpp index be24ed4..e74ab20 100644 --- a/src/repository.cpp +++ b/src/repository.cpp @@ -18,6 +18,31 @@ #include "repository.h" #include #include +#include + +static const int maxSimultaneousProcesses = 100; + +class ProcessCache: QLinkedList +{ +public: + void touch(Repository *repo) + { + remove(repo); + + // if the cache is too big, remove from the front + while (size() >= maxSimultaneousProcesses) + takeFirst()->closeFastImport(); + + // append to the end + append(repo); + } + + inline void remove(Repository *repo) + { + removeOne(repo); + } +}; +static ProcessCache processCache; Repository::Repository(const Rules::Repository &rule) : name(rule.name), commitCount(0), processHasStarted(false) @@ -36,6 +61,11 @@ Repository::Repository(const Rules::Repository &rule) } Repository::~Repository() +{ + closeFastImport(); +} + +void Repository::closeFastImport() { if (fastImport.state() != QProcess::NotRunning) { fastImport.write("checkpoint\n"); @@ -47,6 +77,8 @@ Repository::~Repository() qWarning() << "git-fast-import for repository" << name << "did not die"; } } + processHasStarted = false; + processCache.remove(this); } void Repository::reloadBranches() @@ -198,6 +230,8 @@ QIODevice *Repository::Transaction::addFile(const QString &path, int mode, qint6 void Repository::Transaction::commit() { + processCache.touch(repository); + // create the commit message QByteArray message = log; if (!message.endsWith('\n'))