Module: Mesa Branch: master Commit: 3836857a777a248dd212ce7a1d7307d2984fda7d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3836857a777a248dd212ce7a1d7307d2984fda7d
Author: Marek Olšák <[email protected]> Date: Thu Jun 25 20:39:34 2015 +0200 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 <[email protected]> Reviewed-by: Alex Deucher <[email protected]> --- src/gallium/auxiliary/os/os_time.c | 38 +++++++++++++++++++++++++++++++++++- src/gallium/auxiliary/os/os_time.h | 11 +++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/os/os_time.c b/src/gallium/auxiliary/os/os_time.c index f7e4ca4..bd09452 100644 --- a/src/gallium/auxiliary/os/os_time.c +++ b/src/gallium/auxiliary/os/os_time.c @@ -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; + } +} diff --git a/src/gallium/auxiliary/os/os_time.h b/src/gallium/auxiliary/os/os_time.h index 4fab03c..2989af1 100644 --- a/src/gallium/auxiliary/os/os_time.h +++ b/src/gallium/auxiliary/os/os_time.h @@ -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 _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
