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.
This commit is contained in:
Christian Hergert
2020-02-20 10:38:35 -08:00
parent 2cd05c1bd8
commit cd8a99402f
3 changed files with 14 additions and 4 deletions

View File

@ -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')

View File

@ -22,7 +22,6 @@
#include "config.h"
#include <stdatomic.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>

View File

@ -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;
}