[Mesa-dev] [PATCH] gallium/os: add os_wait_until_zero
Jose Fonseca
jfonseca at vmware.com
Fri Jun 26 07:47:21 PDT 2015
On 26/06/15 12:05, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> This will be used by radeon and amdgpu winsyses.
> Copied from the amdgpu winsys.
> ---
> src/gallium/auxiliary/os/os_time.c | 36 +++++++++++++++++++++++++++++++++++-
> src/gallium/auxiliary/os/os_time.h | 10 ++++++++++
> 2 files changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/os/os_time.c b/src/gallium/auxiliary/os/os_time.c
> index f7e4ca4..63b6879 100644
> --- a/src/gallium/auxiliary/os/os_time.c
> +++ b/src/gallium/auxiliary/os/os_time.c
> @@ -33,11 +33,12 @@
> */
>
>
> -#include "pipe/p_config.h"
> +#include "pipe/p_defines.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 +93,36 @@ os_time_sleep(int64_t usecs)
> }
>
> #endif
> +
> +
> +bool os_wait_until_zero(int *var, uint64_t timeout)
should var be a volatile pointer? I'm surprised it works without it.
Maybe it just works on Unixes thanks to the sched_yield call, and the
assumption it might any any side effects.
Jose
> +{
> + if (!*var)
> + return true;
> +
> + if (!timeout)
> + return false;
> +
> + if (timeout == PIPE_TIMEOUT_INFINITE) {
> + while (*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 (*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..fdc8040 100644
> --- a/src/gallium/auxiliary/os/os_time.h
> +++ b/src/gallium/auxiliary/os/os_time.h
> @@ -94,6 +94,16 @@ os_time_timeout(int64_t start,
> }
>
>
> +/**
> + * Wait until the variable at the given memory location is zero.
> + *
> + * \param var variable
> + * \param timeout timeout, 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(int *var, uint64_t timeout);
> +
> #ifdef __cplusplus
> }
> #endif
>
More information about the mesa-dev
mailing list