summaryrefslogtreecommitdiff
path: root/platform/darwin/src/timer.cpp
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-02-16 12:52:25 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-04-01 09:26:54 -0700
commit879382f72405edd1840d2f37744bcba49131859a (patch)
tree4f632c8973d1c5539437e790edb471090339b533 /platform/darwin/src/timer.cpp
parent7e9a4f15c5082dfe5987e1dcbb4b816f04068a60 (diff)
downloadqtlocation-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.cpp60
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