| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_FML_PLATFORM_LINUX_TIMER_FD_H_ | |
| #define FLUTTER_FML_PLATFORM_LINUX_TIMER_FD_H_ | |
| #include "flutter/fml/time/time_point.h" | |
| // clang-format off | |
| #if __has_include(<sys/timerfd.h>) && \ | |
| (!defined(__ANDROID_API__) || __ANDROID_API__ >= 19) | |
| // sys/timerfd.h is always present in Android NDK due to unified headers, | |
| // but timerfd functions are only available on API 19 or later. | |
| // clang-format on | |
| #include <sys/timerfd.h> | |
| #define FML_TIMERFD_AVAILABLE 1 | |
| #else // __has_include(<sys/timerfd.h>) | |
| #define FML_TIMERFD_AVAILABLE 0 | |
| #include <sys/types.h> | |
| // Must come after sys/types | |
| #include <linux/time.h> | |
| #define TFD_TIMER_ABSTIME (1 << 0) | |
| #define TFD_TIMER_CANCEL_ON_SET (1 << 1) | |
| #define TFD_CLOEXEC O_CLOEXEC | |
| #define TFD_NONBLOCK O_NONBLOCK | |
| int timerfd_create(int clockid, int flags); | |
| int timerfd_settime(int ufc, | |
| int flags, | |
| const struct itimerspec* utmr, | |
| struct itimerspec* otmr); | |
| #endif // __has_include(<sys/timerfd.h>) | |
| namespace fml { | |
| /// Rearms the timer to expire at the given time point. | |
| bool TimerRearm(int fd, fml::TimePoint time_point); | |
| /// Drains the timer FD and returns true if it has expired. This may be false in | |
| /// case the timer read is non-blocking and this routine was called before the | |
| /// timer expiry. | |
| bool TimerDrain(int fd); | |
| } // namespace fml | |
| #endif // FLUTTER_FML_PLATFORM_LINUX_TIMER_FD_H_ |