[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