#include <QElapsedTimer>
#include <QSet>
#include <QHash>
+#include <QQueue>
#include "Mirrors.h"
// Helper Functions
////////////////////////////////////////////////////////////
-static QStringList buildRandomList(const char *const values[])
+static QQueue<QString> buildRandomList(const char *const *values)
{
- QStringList list;
- for (int index = 0; values[index]; index++)
+ QQueue<QString> list;
+ while(*values)
{
- const int pos = MUtils::next_rand_u32() % (index + 1);
- list.insert(pos, QString::fromLatin1(values[index]));
+ list.insert(MUtils::next_rand_u32(list.size() + 1), QString::fromLatin1(*(values++)));
}
return list;
}
// ----- Test Known Hosts Connectivity ----- //
int connectionScore = 0;
- QStringList mirrorList = buildRandomList(known_hosts);
+ QQueue<QString> mirrorList = buildRandomList(known_hosts);
- for(int connectionTimout = 1000; connectionTimout <= MAX_CONN_TIMEOUT; connectionTimout *= 2)
+ for(int connectionTimeout = 1000; connectionTimeout <= MAX_CONN_TIMEOUT; connectionTimeout *= 2)
{
QElapsedTimer elapsedTimer;
elapsedTimer.start();
- const int globalTimout = 2 * MIN_CONNSCORE * connectionTimout;
- while (!elapsedTimer.hasExpired(globalTimout))
+ const qint64 globalTimeout = 2 * MIN_CONNSCORE * connectionTimeout;
+ forever
{
- const QString hostName = mirrorList.takeFirst();
- if (tryContactHost(hostName, connectionTimout))
+ if (mirrorList.isEmpty())
{
- setProgress(1 + (connectionScore += 1));
- elapsedTimer.restart();
+ goto endLoop; /*depleted!*/
+ }
+ const QString hostName = mirrorList.dequeue();
+ if (tryContactHost(hostName, connectionTimeout))
+ {
+ setProgress(1 + (++connectionScore));
if (connectionScore >= MIN_CONNSCORE)
{
goto endLoop; /*success*/
}
else
{
- mirrorList.append(hostName); /*re-schedule*/
+ mirrorList.enqueue(hostName);
+ if(elapsedTimer.hasExpired(globalTimeout))
+ {
+ break; /*timer expired*/
+ }
}
CHECK_CANCELLED();
- msleep(1);
}
}