MCPcopy Create free account
hub / github.com/RPCSX/rpcsx / wait

Method wait

kernel/cellos/src/sys_rsxaudio.cpp:1997–2097  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1995}
1996
1997rsxaudio_periodic_tmr::wait_result
1998rsxaudio_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

Callers 15

sys_rwlock_rlockFunction · 0.45
sys_rwlock_wlockFunction · 0.45
sys_event_flag_waitFunction · 0.45
operator()Method · 0.45
sys_net_bnet_acceptFunction · 0.45
sys_net_bnet_connectFunction · 0.45
sys_net_bnet_recvfromFunction · 0.45
sys_net_bnet_sendtoFunction · 0.45
sys_net_bnet_pollFunction · 0.45
sys_net_bnet_selectFunction · 0.45
_sys_process_exitFunction · 0.45
lv2_exitspawnFunction · 0.45

Calls 3

keventClass · 0.70
unlockMethod · 0.45
lockMethod · 0.45

Tested by

no test coverage detected