mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 04:48:08 +02:00
gallium/os: add os_wait_until_zero (v2)
This will be used by radeon and amdgpu winsyses. Copied from the amdgpu winsys. v2: use volatile and p_atomic_read Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
245b464d5c
commit
3836857a77
2 changed files with 48 additions and 1 deletions
|
|
@ -33,11 +33,13 @@
|
|||
*/
|
||||
|
||||
|
||||
#include "pipe/p_config.h"
|
||||
#include "pipe/p_defines.h"
|
||||
#include "util/u_atomic.h"
|
||||
|
||||
#if defined(PIPE_OS_UNIX)
|
||||
# include <time.h> /* timeval */
|
||||
# include <sys/time.h> /* timeval */
|
||||
# include <sched.h> /* sched_yield */
|
||||
#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
|
||||
# include <windows.h>
|
||||
#else
|
||||
|
|
@ -92,3 +94,37 @@ os_time_sleep(int64_t usecs)
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
bool
|
||||
os_wait_until_zero(volatile int *var, uint64_t timeout)
|
||||
{
|
||||
if (!p_atomic_read(var))
|
||||
return true;
|
||||
|
||||
if (!timeout)
|
||||
return false;
|
||||
|
||||
if (timeout == PIPE_TIMEOUT_INFINITE) {
|
||||
while (p_atomic_read(var)) {
|
||||
#if defined(PIPE_OS_UNIX)
|
||||
sched_yield();
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
int64_t start_time = os_time_get_nano();
|
||||
int64_t end_time = start_time + timeout;
|
||||
|
||||
while (p_atomic_read(var)) {
|
||||
if (os_time_timeout(start_time, end_time, os_time_get_nano()))
|
||||
return false;
|
||||
|
||||
#if defined(PIPE_OS_UNIX)
|
||||
sched_yield();
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,6 +94,17 @@ os_time_timeout(int64_t start,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Wait until the variable at the given memory location is zero.
|
||||
*
|
||||
* \param var variable
|
||||
* \param timeout timeout in ns, can be anything from 0 (no wait) to
|
||||
* PIPE_TIME_INFINITE (wait forever)
|
||||
* \return true if the variable is zero
|
||||
*/
|
||||
bool
|
||||
os_wait_until_zero(volatile int *var, uint64_t timeout);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue