Experiment with typesafe time units
This commit is contained in:
parent
1a968b3a64
commit
b2a532be62
@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
#include "closure.h"
|
#include "closure.h"
|
||||||
|
|
||||||
#include <QTimer>
|
|
||||||
|
|
||||||
#include "core/timeconstants.h"
|
#include "core/timeconstants.h"
|
||||||
|
|
||||||
namespace _detail {
|
namespace _detail {
|
||||||
@ -65,11 +63,3 @@ void DoInAMinuteOrSo(QObject* receiver, const char* slot) {
|
|||||||
int msec = (60 + (qrand() % 60)) * kMsecPerSec;
|
int msec = (60 + (qrand() % 60)) * kMsecPerSec;
|
||||||
DoAfter(receiver, slot, msec);
|
DoAfter(receiver, slot, msec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DoAfter(std::function<void()> callback, int msec) {
|
|
||||||
QTimer* timer = new QTimer;
|
|
||||||
timer->setSingleShot(true);
|
|
||||||
NewClosure(timer, SIGNAL(timeout()), callback);
|
|
||||||
QObject::connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
|
|
||||||
timer->start(msec);
|
|
||||||
}
|
|
||||||
|
@ -18,12 +18,14 @@
|
|||||||
#ifndef CLOSURE_H
|
#ifndef CLOSURE_H
|
||||||
#define CLOSURE_H
|
#define CLOSURE_H
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <QMetaMethod>
|
#include <QMetaMethod>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QSharedPointer>
|
#include <QSharedPointer>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
namespace _detail {
|
namespace _detail {
|
||||||
|
|
||||||
@ -188,7 +190,19 @@ _detail::ClosureBase* NewClosure(QObject* sender, const char* signal,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DoAfter(QObject* receiver, const char* slot, int msec);
|
void DoAfter(QObject* receiver, const char* slot, int msec);
|
||||||
void DoAfter(std::function<void()> callback, int msec);
|
void DoAfter(std::function<void()> callback, std::chrono::milliseconds msec);
|
||||||
void DoInAMinuteOrSo(QObject* receiver, const char* slot);
|
void DoInAMinuteOrSo(QObject* receiver, const char* slot);
|
||||||
|
|
||||||
|
template <typename R, typename P>
|
||||||
|
void DoAfter(
|
||||||
|
std::function<void()> callback, std::chrono::duration<R, P> duration) {
|
||||||
|
QTimer* timer = new QTimer;
|
||||||
|
timer->setSingleShot(true);
|
||||||
|
NewClosure(timer, SIGNAL(timeout()), callback);
|
||||||
|
QObject::connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
|
||||||
|
std::chrono::milliseconds msec =
|
||||||
|
std::chrono::duration_cast<std::chrono::milliseconds>(duration);
|
||||||
|
timer->start(msec.count());
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CLOSURE_H
|
#endif // CLOSURE_H
|
||||||
|
@ -266,3 +266,17 @@ void DumpStackTrace() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} // namespace logging
|
} // namespace logging
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
QString print_duration(T duration, const std::string& unit) {
|
||||||
|
return QString("%1%2").arg(duration.count()).arg(unit.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
QDebug operator<<(QDebug dbg, std::chrono::seconds secs) {
|
||||||
|
dbg.nospace() << print_duration(secs, "s");
|
||||||
|
return dbg.space();
|
||||||
|
}
|
||||||
|
@ -21,6 +21,9 @@
|
|||||||
#ifndef LOGGING_H
|
#ifndef LOGGING_H
|
||||||
#define LOGGING_H
|
#define LOGGING_H
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
#ifdef QT_NO_DEBUG_STREAM
|
#ifdef QT_NO_DEBUG_STREAM
|
||||||
@ -61,4 +64,6 @@ void GLog(const char* domain, int level, const char* message, void* user_data);
|
|||||||
extern const char* kDefaultLogLevels;
|
extern const char* kDefaultLogLevels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDebug operator<<(QDebug debug, std::chrono::seconds secs);
|
||||||
|
|
||||||
#endif // LOGGING_H
|
#endif // LOGGING_H
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "internet/amazon/amazonclouddrive.h"
|
#include "internet/amazon/amazonclouddrive.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
@ -37,6 +38,7 @@
|
|||||||
#include "library/librarybackend.h"
|
#include "library/librarybackend.h"
|
||||||
#include "ui/settingsdialog.h"
|
#include "ui/settingsdialog.h"
|
||||||
|
|
||||||
|
using std::chrono::seconds;
|
||||||
using std::placeholders::_1;
|
using std::placeholders::_1;
|
||||||
|
|
||||||
const char* AmazonCloudDrive::kServiceName = "Amazon Cloud Drive";
|
const char* AmazonCloudDrive::kServiceName = "Amazon Cloud Drive";
|
||||||
@ -197,16 +199,16 @@ void AmazonCloudDrive::MonitorReply(QNetworkReply* reply,
|
|||||||
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||||
if (code >= 500) { // Retry with exponential backoff.
|
if (code >= 500) { // Retry with exponential backoff.
|
||||||
int max_delay_s = std::pow(std::min(retries + 1, 8), 2);
|
int max_delay_s = std::pow(std::min(retries + 1, 8), 2);
|
||||||
int delay_s = qrand() % max_delay_s;
|
seconds delay(qrand() % max_delay_s);
|
||||||
qLog(Debug) << "Request failed with code:" << code << "- retrying after"
|
qLog(Debug) << "Request failed with code:" << code << "- retrying after"
|
||||||
<< delay_s << "seconds";
|
<< delay << "seconds";
|
||||||
DoAfter([=]() {
|
DoAfter([=]() {
|
||||||
if (post_data.isEmpty()) {
|
if (post_data.isEmpty()) {
|
||||||
Get(reply->request(), done, retries + 1);
|
Get(reply->request(), done, retries + 1);
|
||||||
} else {
|
} else {
|
||||||
Post(reply->request(), post_data, done, retries + 1);
|
Post(reply->request(), post_data, done, retries + 1);
|
||||||
}
|
}
|
||||||
}, delay_s * kMsecPerSec);
|
}, delay);
|
||||||
} else {
|
} else {
|
||||||
// Request failed permanently.
|
// Request failed permanently.
|
||||||
done(reply);
|
done(reply);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user