On 13.05.2017 11:20, Jan Beich wrote:
glsl/.libs/libstandalone.a(libmesautil_la-disk_cache.o): In function 
`disk_cache_remove':
disk_cache.c:(.text+0x763): undefined reference to `__atomic_fetch_add_8'
glsl/.libs/libstandalone.a(libmesautil_la-disk_cache.o): In function 
`cache_put':
disk_cache.c:(.text+0xabc): undefined reference to `__atomic_fetch_add_8'
disk_cache.c:(.text+0xec1): undefined reference to `__atomic_fetch_add_8'
c++: error: linker command failed with exit code 1 (use -v to see invocation)
>
Signed-off-by: Jan Beich <jbe...@freebsd.org>

So... there's a bit of a conceptual problem here.

disk_cache uses atomics on mmap()ed files, and relies on atomicity across process boundaries.

This workaround will only result in atomicity local to each process, which really doesn't buy anything, because disk_cache updates are restricted to one thread per process anyway.

Why on earth don't you have 8-byte atomics? Are you still trying to support the original 386 or something?

Cheers,
Nicolai



---
 configure.ac        | 13 ++++++++++++-
 src/util/u_atomic.c |  4 ++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index ce5301f3e4..08d8879986 100644
--- a/configure.ac
+++ b/configure.ac
@@ -415,13 +415,24 @@ AM_CONDITIONAL([GCC_ATOMIC_BUILTINS_SUPPORTED], [test 
x$GCC_ATOMIC_BUILTINS_SUPP

 dnl Check if host supports 64-bit atomics
 dnl note that lack of support usually results in link (not compile) error
-AC_MSG_CHECKING(whether __sync_add_and_fetch_8 is supported)
+save_CFLAGS=$CFLAGS
+if test "x$GCC_ATOMIC_BUILTINS_SUPPORTED" = x1; then
+    CFLAGS="$CFLAGS -DUSE_GCC_ATOMIC_BUILTINS"
+    AC_MSG_CHECKING(whether __atomic_fetch_add_8 is supported)
+else
+    AC_MSG_CHECKING(whether __sync_add_and_fetch_8 is supported)
+fi
 AC_LINK_IFELSE([AC_LANG_SOURCE([[
 #include <stdint.h>
 uint64_t v;
 int main() {
+#ifdef USE_GCC_ATOMIC_BUILTINS
+    return __atomic_add_fetch(&v, 1, __ATOMIC_ACQ_REL);
+#else
     return __sync_add_and_fetch(&v, (uint64_t)1);
+#endif
 }]])], GCC_64BIT_ATOMICS_SUPPORTED=yes, GCC_64BIT_ATOMICS_SUPPORTED=no)
+CFLAGS=$save_CFLAGS
 if test "x$GCC_64BIT_ATOMICS_SUPPORTED" != xyes; then
     DEFINES="$DEFINES -DMISSING_64BIT_ATOMICS"
 fi
diff --git a/src/util/u_atomic.c b/src/util/u_atomic.c
index 44b75fb0c0..691c34cf30 100644
--- a/src/util/u_atomic.c
+++ b/src/util/u_atomic.c
@@ -34,6 +34,7 @@

 static pthread_mutex_t sync_mutex = PTHREAD_MUTEX_INITIALIZER;

+#ifndef USE_GCC_ATOMIC_BUILTINS
 WEAK uint64_t
 __sync_add_and_fetch_8(uint64_t *ptr, uint64_t val)
 {
@@ -60,6 +61,8 @@ __sync_sub_and_fetch_8(uint64_t *ptr, uint64_t val)
    return r;
 }

+#else
+
 WEAK uint64_t
 __atomic_fetch_add_8(uint64_t *ptr, uint64_t val, int memorder)
 {
@@ -71,5 +74,6 @@ __atomic_fetch_sub_8(uint64_t *ptr, uint64_t val, int 
memorder)
 {
    return __sync_sub_and_fetch(ptr, val);
 }
+#endif /* !USE_GCC_ATOMIC_BUILTINS */

 #endif
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to