summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/os
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2015-06-25 20:39:34 +0200
committerMarek Olšák <marek.olsak@amd.com>2015-07-05 15:08:59 +0200
commit3836857a777a248dd212ce7a1d7307d2984fda7d (patch)
treef08d49934b2f8337e5e9c59506635d4d1472ea2a /src/gallium/auxiliary/os
parent245b464d5caa21680373ae5929dccd294078cc50 (diff)
downloadexternal_mesa3d-3836857a777a248dd212ce7a1d7307d2984fda7d.zip
external_mesa3d-3836857a777a248dd212ce7a1d7307d2984fda7d.tar.gz
external_mesa3d-3836857a777a248dd212ce7a1d7307d2984fda7d.tar.bz2
gallium/os: add os_wait_until_zero (v2)
This will be used by radeon and amdgpu winsyses. Copied from the amdgpu winsys. v2: use volatile and p_atomic_read Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src/gallium/auxiliary/os')
-rw-r--r--src/gallium/auxiliary/os/os_time.c38
-rw-r--r--src/gallium/auxiliary/os/os_time.h11
2 files changed, 48 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/os/os_time.c b/src/gallium/auxiliary/os/os_time.c
index f7e4ca4..bd09452 100644
--- a/src/gallium/auxiliary/os/os_time.c
+++ b/src/gallium/auxiliary/os/os_time.c
@@ -33,11 +33,13 @@
*/
-#include "pipe/p_config.h"
+#include "pipe/p_defines.h"
+#include "util/u_atomic.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 +94,37 @@ os_time_sleep(int64_t usecs)
}
#endif
+
+
+bool
+os_wait_until_zero(volatile int *var, uint64_t timeout)
+{
+ if (!p_atomic_read(var))
+ return true;
+
+ if (!timeout)
+ return false;
+
+ if (timeout == PIPE_TIMEOUT_INFINITE) {
+ while (p_atomic_read(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 (p_atomic_read(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..2989af1 100644
--- a/src/gallium/auxiliary/os/os_time.h
+++ b/src/gallium/auxiliary/os/os_time.h
@@ -94,6 +94,17 @@ os_time_timeout(int64_t start,
}
+/**
+ * Wait until the variable at the given memory location is zero.
+ *
+ * \param var variable
+ * \param timeout timeout in ns, 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(volatile int *var, uint64_t timeout);
+
#ifdef __cplusplus
}
#endif