diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-02-16 12:52:25 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-04-01 09:26:54 -0700 |
commit | 879382f72405edd1840d2f37744bcba49131859a (patch) | |
tree | 4f632c8973d1c5539437e790edb471090339b533 /platform/darwin/src/timer.cpp | |
parent | 7e9a4f15c5082dfe5987e1dcbb4b816f04068a60 (diff) | |
download | qtlocation-mapboxgl-879382f72405edd1840d2f37744bcba49131859a.tar.gz |
[ios, osx] Replace libuv with native implementations
Diffstat (limited to 'platform/darwin/src/timer.cpp')
-rw-r--r-- | platform/darwin/src/timer.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/platform/darwin/src/timer.cpp b/platform/darwin/src/timer.cpp new file mode 100644 index 0000000000..e9e58d86c6 --- /dev/null +++ b/platform/darwin/src/timer.cpp @@ -0,0 +1,60 @@ +#include <mbgl/util/timer.hpp> + +#include <CoreFoundation/CoreFoundation.h> + +namespace mbgl { +namespace util { + +CFTimeInterval toCFTimeInterval(Duration duration) { + return std::chrono::duration<CFTimeInterval>(duration).count(); +} + +CFAbsoluteTime toCFAbsoluteTime(Duration duration) { + return CFAbsoluteTimeGetCurrent() + toCFTimeInterval(duration); +} + +class Timer::Impl { +public: + Impl(Duration timeout, Duration repeat, std::function<void()>&& fn) + : task(std::move(fn)), + loop(CFRunLoopGetCurrent()) { + CFRunLoopTimerContext context = { + 0, + this, + nullptr, + nullptr, + nullptr + }; + timer = CFRunLoopTimerCreate(kCFAllocatorDefault, toCFAbsoluteTime(timeout), toCFTimeInterval(repeat), 0, 0, perform, &context); + CFRunLoopAddTimer(loop, timer, kCFRunLoopDefaultMode); + } + + ~Impl() { + CFRunLoopRemoveTimer(loop, timer, kCFRunLoopDefaultMode); + CFRelease(timer); + } + +private: + static void perform(CFRunLoopTimerRef, void* info) { + reinterpret_cast<Impl*>(info)->task(); + } + + std::function<void()> task; + + CFRunLoopRef loop; + CFRunLoopTimerRef timer; +}; + +Timer::Timer() = default; +Timer::~Timer() = default; + +void Timer::start(Duration timeout, Duration repeat, std::function<void()>&& cb) { + impl = std::make_unique<Impl>(timeout, repeat, std::move(cb)); +} + +void Timer::stop() { + impl.reset(); +} + +} // namespace util +} // namespace mbgl |