| 1995 | } |
| 1996 | |
| 1997 | rsxaudio_periodic_tmr::wait_result |
| 1998 | rsxaudio_periodic_tmr::wait(const std::function<void()> &callback) { |
| 1999 | std::unique_lock lock(mutex); |
| 2000 | |
| 2001 | if (in_wait || !callback) { |
| 2002 | return wait_result::INVALID_PARAM; |
| 2003 | } |
| 2004 | |
| 2005 | in_wait = true; |
| 2006 | |
| 2007 | bool tmr_error = false; |
| 2008 | bool timeout = false; |
| 2009 | bool wait_canceled = false; |
| 2010 | |
| 2011 | if (!zero_period) { |
| 2012 | lock.unlock(); |
| 2013 | constexpr u8 obj_wait_cnt = 2; |
| 2014 | |
| 2015 | #if defined(_WIN32) |
| 2016 | const HANDLE wait_arr[obj_wait_cnt] = {timer_handle, cancel_event}; |
| 2017 | const auto wait_status = |
| 2018 | WaitForMultipleObjects(obj_wait_cnt, wait_arr, false, INFINITE); |
| 2019 | |
| 2020 | if (wait_status == WAIT_FAILED || |
| 2021 | (wait_status >= WAIT_ABANDONED_0 && |
| 2022 | wait_status < WAIT_ABANDONED_0 + obj_wait_cnt)) { |
| 2023 | tmr_error = true; |
| 2024 | } else if (wait_status == WAIT_TIMEOUT) { |
| 2025 | timeout = true; |
| 2026 | } else if (wait_status == WAIT_OBJECT_0 + 1) { |
| 2027 | wait_canceled = true; |
| 2028 | } |
| 2029 | #elif defined(__linux__) |
| 2030 | epoll_event event[obj_wait_cnt]{}; |
| 2031 | int wait_status = 0; |
| 2032 | do { |
| 2033 | wait_status = epoll_wait(epoll_fd, event, obj_wait_cnt, -1); |
| 2034 | } while (wait_status == -1 && errno == EINTR); |
| 2035 | |
| 2036 | if (wait_status < 0 || wait_status > obj_wait_cnt) { |
| 2037 | tmr_error = true; |
| 2038 | } else if (wait_status == 0) { |
| 2039 | timeout = true; |
| 2040 | } else { |
| 2041 | for (int i = 0; i < wait_status; i++) { |
| 2042 | if (event[i].data.fd == cancel_event) { |
| 2043 | wait_canceled = true; |
| 2044 | break; |
| 2045 | } |
| 2046 | } |
| 2047 | } |
| 2048 | #elif defined(BSD) || defined(__APPLE__) |
| 2049 | struct kevent event[obj_wait_cnt]{}; |
| 2050 | int wait_status = 0; |
| 2051 | do { |
| 2052 | wait_status = kevent(kq, nullptr, 0, event, obj_wait_cnt, nullptr); |
| 2053 | } while (wait_status == -1 && errno == EINTR); |
| 2054 |
no test coverage detected