[core] Introduce Timer abstraction

This commit is contained in:
Thiago Marcos P. Santos
2015-10-27 14:27:16 +02:00
parent 0d8ea6c0a2
commit 9b36c19aeb
8 changed files with 78 additions and 5 deletions

View File

@@ -19,6 +19,7 @@
'../platform/default/image.cpp',
'../platform/default/png_reader.cpp',
'../platform/default/jpeg_reader.cpp',
'../platform/default/timer.cpp',
],
'variables': {

View File

@@ -12,6 +12,7 @@
'sources': [
'../platform/default/async_task.cpp',
'../platform/default/run_loop.cpp',
'../platform/default/timer.cpp',
'../platform/darwin/log_nslog.mm',
'../platform/darwin/string_nsstring.mm',
'../platform/darwin/application_root.mm',

View File

@@ -20,6 +20,7 @@
'../platform/default/image.cpp',
'../platform/default/png_reader.cpp',
'../platform/default/jpeg_reader.cpp',
'../platform/default/timer.cpp',
],
'variables': {

View File

@@ -12,6 +12,7 @@
'sources': [
'../platform/default/async_task.cpp',
'../platform/default/run_loop.cpp',
'../platform/default/timer.cpp',
'../platform/darwin/log_nslog.mm',
'../platform/darwin/string_nsstring.mm',
'../platform/darwin/application_root.mm',

View File

@@ -0,0 +1,30 @@
#ifndef MBGL_UTIL_TIMER
#define MBGL_UTIL_TIMER
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/chrono.hpp>
#include <memory>
#include <functional>
namespace mbgl {
namespace util {
class Timer : private util::noncopyable {
public:
Timer();
~Timer();
void start(Duration timeout, Duration repeat, std::function<void()>&&);
void stop();
void unref();
private:
class Impl;
std::unique_ptr<Impl> impl;
};
}
}
#endif

View File

@@ -0,0 +1,40 @@
#include <mbgl/util/timer.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/uv_detail.hpp>
namespace mbgl {
namespace util {
class Timer::Impl {
public:
Impl()
: timer(reinterpret_cast<uv_loop_t*>(RunLoop::getLoopHandle())) {
}
uv::timer timer;
};
Timer::Timer()
: impl(std::make_unique<Impl>()) {
}
Timer::~Timer() {
}
void Timer::start(Duration timeout, Duration repeat, std::function<void()>&& cb) {
impl->timer.start(std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count(),
std::chrono::duration_cast<std::chrono::milliseconds>(repeat).count(),
std::move(cb));
}
void Timer::stop() {
impl->timer.stop();
}
void Timer::unref() {
impl->timer.unref();
}
}
}

View File

@@ -7,7 +7,6 @@
#include <mbgl/platform/platform.hpp>
#include <mbgl/platform/log.hpp>
#include <mbgl/util/uv_detail.hpp>
#include <mbgl/util/thread.hpp>
#include <mbgl/util/mapbox.hpp>
#include <mbgl/util/exception.hpp>
@@ -236,11 +235,10 @@ void DefaultFileSource::Impl::reschedule(DefaultFileRequestImpl& request) {
update(request);
} else if (timeout > Seconds::zero()) {
if (!request.timerRequest) {
request.timerRequest = std::make_unique<uv::timer>(util::RunLoop::getLoop());
request.timerRequest = std::make_unique<util::Timer>();
}
// timeout is in seconds, but the timer takes milliseconds.
request.timerRequest->start(asMilliseconds(timeout).count(), 0, [this, &request] {
request.timerRequest->start(timeout, Duration::zero(), [this, &request] {
assert(!request.realRequest);
startRealRequest(request);
});

View File

@@ -7,6 +7,7 @@
#include <mbgl/util/async_task.hpp>
#include <mbgl/util/noncopyable.hpp>
#include <mbgl/util/chrono.hpp>
#include <mbgl/util/timer.hpp>
#include <set>
#include <unordered_map>
@@ -40,7 +41,7 @@ public:
const Resource resource;
std::unique_ptr<WorkRequest> cacheRequest;
RequestBase* realRequest = nullptr;
std::unique_ptr<uv::timer> timerRequest;
std::unique_ptr<util::Timer> timerRequest;
inline DefaultFileRequestImpl(const Resource& resource_)
: resource(resource_) {}