[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