| 1798 | return ((spinlock*)arg)->lock(); |
| 1799 | } |
| 1800 | static int cvar_do_wait(thread_list* q, void* m, Timeout timeout, int(*lock)(void*), void(*unlock)(void*)) { |
| 1801 | assert(m); |
| 1802 | if (!m) |
| 1803 | LOG_ERROR_RETURN(EINVAL, -1, "there must be a lock"); |
| 1804 | int ret = thread_usleep_defer(timeout, q, unlock, m); |
| 1805 | auto en = ret < 0 ? errno : 0; |
| 1806 | while (true) { |
| 1807 | int lock_ret = lock(m); |
| 1808 | if (lock_ret == 0) break; |
| 1809 | LOG_ERROR("failed to get mutex lock, ` `, try again", VALUE(ret), ERRNO()); |
| 1810 | thread_usleep(1000, nullptr); |
| 1811 | } |
| 1812 | if (ret < 0) errno = en; |
| 1813 | return waitq_translate_errno(ret); |
| 1814 | |
| 1815 | } |
| 1816 | int condition_variable::wait(mutex* m, Timeout timeout) |
| 1817 | { |
| 1818 | return cvar_do_wait((thread_list*)&q, m, timeout, mutex_lock, mutex_unlock); |
no test coverage detected