From: Thiago Macieira Date: Sat, 23 Aug 2008 20:48:34 +0000 (+0200) Subject: Add a process cache to keep the number of processes under 100 X-Git-Url: https://repo.or.cz/w/svn-all-fast-export.git/commitdiff_plain/374d4cd6fe492af4bcb0adf46e380f55be737d01 Add a process cache to keep the number of processes under 100 --- 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) @@ -37,6 +62,11 @@ Repository::Repository(const Rules::Repository &rule) Repository::~Repository() { + closeFastImport(); +} + +void Repository::closeFastImport() +{ if (fastImport.state() != QProcess::NotRunning) { fastImport.write("checkpoint\n"); fastImport.waitForBytesWritten(-1); @@ -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')) diff --git a/src/repository.h b/src/repository.h index 4692080..d837599 100644 --- a/src/repository.h +++ b/src/repository.h @@ -80,7 +80,9 @@ private: bool processHasStarted; void startFastImport(); + void closeFastImport(); + friend class ProcessCache; Q_DISABLE_COPY(Repository) };