diff --git a/gyp/platform-android.gypi b/gyp/platform-android.gypi index 02f46b063..c9a7d3b6a 100644 --- a/gyp/platform-android.gypi +++ b/gyp/platform-android.gypi @@ -19,6 +19,7 @@ '../platform/default/image.cpp', '../platform/default/png_reader.cpp', '../platform/default/jpeg_reader.cpp', + '../platform/default/timer.cpp', ], 'variables': { diff --git a/gyp/platform-ios.gypi b/gyp/platform-ios.gypi index 240fa28e4..6a29fbd61 100644 --- a/gyp/platform-ios.gypi +++ b/gyp/platform-ios.gypi @@ -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', diff --git a/gyp/platform-linux.gypi b/gyp/platform-linux.gypi index ce2fe3b14..eb54bdf9e 100644 --- a/gyp/platform-linux.gypi +++ b/gyp/platform-linux.gypi @@ -20,6 +20,7 @@ '../platform/default/image.cpp', '../platform/default/png_reader.cpp', '../platform/default/jpeg_reader.cpp', + '../platform/default/timer.cpp', ], 'variables': { diff --git a/gyp/platform-osx.gypi b/gyp/platform-osx.gypi index a410826b5..1ccbd3d59 100644 --- a/gyp/platform-osx.gypi +++ b/gyp/platform-osx.gypi @@ -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', diff --git a/include/mbgl/util/timer.hpp b/include/mbgl/util/timer.hpp new file mode 100644 index 000000000..932bb4795 --- /dev/null +++ b/include/mbgl/util/timer.hpp @@ -0,0 +1,30 @@ +#ifndef MBGL_UTIL_TIMER +#define MBGL_UTIL_TIMER + +#include +#include + +#include +#include + +namespace mbgl { +namespace util { + +class Timer : private util::noncopyable { +public: + Timer(); + ~Timer(); + + void start(Duration timeout, Duration repeat, std::function&&); + void stop(); + void unref(); + +private: + class Impl; + std::unique_ptr impl; +}; + +} +} + +#endif diff --git a/platform/default/timer.cpp b/platform/default/timer.cpp new file mode 100644 index 000000000..b77eaac84 --- /dev/null +++ b/platform/default/timer.cpp @@ -0,0 +1,40 @@ +#include + +#include +#include + +namespace mbgl { +namespace util { + +class Timer::Impl { +public: + Impl() + : timer(reinterpret_cast(RunLoop::getLoopHandle())) { + } + + uv::timer timer; +}; + +Timer::Timer() + : impl(std::make_unique()) { +} + +Timer::~Timer() { +} + +void Timer::start(Duration timeout, Duration repeat, std::function&& cb) { + impl->timer.start(std::chrono::duration_cast(timeout).count(), + std::chrono::duration_cast(repeat).count(), + std::move(cb)); +} + +void Timer::stop() { + impl->timer.stop(); +} + +void Timer::unref() { + impl->timer.unref(); +} + +} +} diff --git a/src/mbgl/storage/default_file_source.cpp b/src/mbgl/storage/default_file_source.cpp index 63a0e329f..367c08336 100644 --- a/src/mbgl/storage/default_file_source.cpp +++ b/src/mbgl/storage/default_file_source.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -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(util::RunLoop::getLoop()); + request.timerRequest = std::make_unique(); } - // 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); }); diff --git a/src/mbgl/storage/default_file_source_impl.hpp b/src/mbgl/storage/default_file_source_impl.hpp index 9580d4e78..e2136b49f 100644 --- a/src/mbgl/storage/default_file_source_impl.hpp +++ b/src/mbgl/storage/default_file_source_impl.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -40,7 +41,7 @@ public: const Resource resource; std::unique_ptr cacheRequest; RequestBase* realRequest = nullptr; - std::unique_ptr timerRequest; + std::unique_ptr timerRequest; inline DefaultFileRequestImpl(const Resource& resource_) : resource(resource_) {}