drisw: use getImageShm() if available
[mesa.git] / src / util / u_thread.h
index 6b5458af86a4085989819635ee15a2c618b852a1..8c6e0bdc59e9669a7dd21be06d39a1805a986eaa 100644 (file)
@@ -62,7 +62,8 @@ static inline void u_thread_setname( const char *name )
 {
 #if defined(HAVE_PTHREAD)
 #  if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \
-      (__GLIBC__ >= 3 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12))
+      (__GLIBC__ >= 3 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12)) && \
+      defined(__linux__)
    pthread_setname_np(pthread_self(), name);
 #  endif
 #endif
@@ -100,4 +101,78 @@ static inline bool u_thread_is_self(thrd_t thread)
    return false;
 }
 
+/*
+ * util_barrier
+ */
+
+#if defined(HAVE_PTHREAD) && !defined(__APPLE__)
+
+typedef pthread_barrier_t util_barrier;
+
+static inline void util_barrier_init(util_barrier *barrier, unsigned count)
+{
+   pthread_barrier_init(barrier, NULL, count);
+}
+
+static inline void util_barrier_destroy(util_barrier *barrier)
+{
+   pthread_barrier_destroy(barrier);
+}
+
+static inline void util_barrier_wait(util_barrier *barrier)
+{
+   pthread_barrier_wait(barrier);
+}
+
+
+#else /* If the OS doesn't have its own, implement barriers using a mutex and a condvar */
+
+typedef struct {
+   unsigned count;
+   unsigned waiters;
+   uint64_t sequence;
+   mtx_t mutex;
+   cnd_t condvar;
+} util_barrier;
+
+static inline void util_barrier_init(util_barrier *barrier, unsigned count)
+{
+   barrier->count = count;
+   barrier->waiters = 0;
+   barrier->sequence = 0;
+   (void) mtx_init(&barrier->mutex, mtx_plain);
+   cnd_init(&barrier->condvar);
+}
+
+static inline void util_barrier_destroy(util_barrier *barrier)
+{
+   assert(barrier->waiters == 0);
+   mtx_destroy(&barrier->mutex);
+   cnd_destroy(&barrier->condvar);
+}
+
+static inline void util_barrier_wait(util_barrier *barrier)
+{
+   mtx_lock(&barrier->mutex);
+
+   assert(barrier->waiters < barrier->count);
+   barrier->waiters++;
+
+   if (barrier->waiters < barrier->count) {
+      uint64_t sequence = barrier->sequence;
+
+      do {
+         cnd_wait(&barrier->condvar, &barrier->mutex);
+      } while (sequence == barrier->sequence);
+   } else {
+      barrier->waiters = 0;
+      barrier->sequence++;
+      cnd_broadcast(&barrier->condvar);
+   }
+
+   mtx_unlock(&barrier->mutex);
+}
+
+#endif
+
 #endif /* U_THREAD_H_ */