[Mesa-dev] [PATCH] gallium/os: add os_wait_until_zero
Marek Olšák
maraeo at gmail.com
Fri Jun 26 08:33:10 PDT 2015
I expect the variable will be changed using an atomic operation by the
CPU, or using a coherent store instruction by the GPU.
If this is wrong and volatile is really required here, then
p_atomic_read is wrong too. Should we fix it? For example:
#define p_atomic_read(_v) (*(volatile int*)(_v))
Then, os_wait_until_zero can use p_atomic_read.
Marek
On Fri, Jun 26, 2015 at 4:48 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> 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