[sysprof] build: fallback to __sync_synchronize()
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sysprof] build: fallback to __sync_synchronize()
- Date: Thu, 20 Feb 2020 19:26:05 +0000 (UTC)
commit cd8a99402f48ff925306b9400055b9db6be5dd35
Author: Christian Hergert <chergert redhat com>
Date: Thu Feb 20 10:38:35 2020 -0800
build: fallback to __sync_synchronize()
If we're running on a GCC older than 4.9, then we won't have the
stdatomic.h available. We can just use a full barrier instead using
__sync_synchronize() to get the same effect, albeit slower.
meson.build | 4 ++--
src/libsysprof-capture/mapped-ring-buffer.c | 1 -
src/libsysprof/sysprof-perf-counter.c | 13 ++++++++++++-
3 files changed, 14 insertions(+), 4 deletions(-)
---
diff --git a/meson.build b/meson.build
index 231445d..b5590b2 100644
--- a/meson.build
+++ b/meson.build
@@ -181,7 +181,7 @@ foreach link_arg: test_link_args
endforeach
add_project_link_arguments(global_link_args, language: 'c')
-if not cc.links('''
+if cc.links('''
#include <stdatomic.h>
int main(void) {
atomic_thread_fence(memory_order_acquire);
@@ -189,7 +189,7 @@ int main(void) {
return 0;
}
''')
- error('Sysprof requires a C compiler with stdatomic support such as GCC 4.9 or newer')
+ config_h.set10('HAVE_STDATOMIC_H', 1)
endif
subdir('src')
diff --git a/src/libsysprof-capture/mapped-ring-buffer.c b/src/libsysprof-capture/mapped-ring-buffer.c
index 11499b6..9b68274 100644
--- a/src/libsysprof-capture/mapped-ring-buffer.c
+++ b/src/libsysprof-capture/mapped-ring-buffer.c
@@ -22,7 +22,6 @@
#include "config.h"
-#include <stdatomic.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
diff --git a/src/libsysprof/sysprof-perf-counter.c b/src/libsysprof/sysprof-perf-counter.c
index 2bc61cc..e896baa 100644
--- a/src/libsysprof/sysprof-perf-counter.c
+++ b/src/libsysprof/sysprof-perf-counter.c
@@ -42,7 +42,9 @@
#include <errno.h>
#include <gio/gio.h>
#include <gio/gunixfdlist.h>
-#include <stdatomic.h>
+#ifdef HAVE_STDATOMIC_H
+# include <stdatomic.h>
+#endif
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
@@ -219,7 +221,11 @@ sysprof_perf_counter_flush (SysprofPerfCounter *self,
tail = info->tail;
head = info->map->data_head;
+#ifdef HAVE_STDATOMIC_H
atomic_thread_fence (memory_order_acquire);
+#elif G_GNUC_CHECK_VERSION(3, 0)
+ __sync_synchronize ();
+#endif
if (head < tail)
tail = head;
@@ -285,7 +291,12 @@ sysprof_perf_counter_flush (SysprofPerfCounter *self,
info->tail = tail;
+#ifdef HAVE_STDATOMIC_H
atomic_thread_fence (memory_order_seq_cst);
+#elif G_GNUC_CHECK_VERSION(3, 0)
+ __sync_synchronize ();
+#endif
+
info->map->data_tail = tail;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]