[Mesa-dev] [PATCH] gallium/os: add os_wait_until_zero
Ilia Mirkin
imirkin at alum.mit.edu
Fri Jun 26 07:48:16 PDT 2015
On Fri, Jun 26, 2015 at 7:05 AM, Marek Olšák <maraeo at gmail.com> 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)
Does this need to be volatile?
> +{
> + 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
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list