[PATCH i-g-t v3 4/4] tests/sw_sync: use atomic_* instead of __sync_*

Guillaume Tucker
2019-06-18T12:27:46Z

Replace calls to the older __sync_* functions with the new atomic_*
standard ones to be consistent with other tests and improve
portability across CPU architectures. Add dependency of sw_sync on
libatomic.

Signed-off-by: Guillaume Tucker <guillaume.tucker@collabora.com>
Reviewed-by: Simon Ser <simon.ser@intel.com>
---

Notes:
v2: use atomic_* and only link libatomic with sw_sync

tests/Makefile.am | 1 +
tests/meson.build | 8 +++++++-
tests/sw_sync.c | 12 ++++++------
3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/tests/Makefile.am b/tests/Makefile.am
index bbd386c9c2db..7d71df8c7a2e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -122,6 +122,7 @@ prime_self_import_LDADD = $(LDADD) -lpthread
gem_userptr_blits_CFLAGS = $(AM_CFLAGS) $(THREAD_CFLAGS)
gem_userptr_blits_LDADD = $(LDADD) -lpthread
perf_pmu_LDADD = $(LDADD) $(top_builddir)/lib/libigt_perf.la
+sw_sync_LDADD = $(LDADD) -latomic

kms_flip_LDADD = $(LDADD) -lpthread

diff --git a/tests/meson.build b/tests/meson.build
index ffd432d38193..34a74025a537 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -76,7 +76,6 @@ test_progs = [
'prime_self_import',
'prime_udl',
'prime_vgem',
- 'sw_sync',
'syncobj_basic',
'syncobj_wait',
'template',
@@ -329,6 +328,13 @@ executable('testdisplay', ['testdisplay.c', 'testdisplay_hotplug.c'],
install : true)
test_list += 'testdisplay'

+test_executables += executable('sw_sync', 'sw_sync.c',
+ dependencies : test_deps + [ libatomic ],
+ install_dir : libexecdir,
+ install_rpath : libexecdir_rpathdir,
+ install : true)
+test_list += 'sw_sync'
+
subdir('amdgpu')

gen_testlist = find_program('generate_testlist.sh')
diff --git a/tests/sw_sync.c b/tests/sw_sync.c
index 950b8b614759..62d1d17cab45 100644
--- a/tests/sw_sync.c
+++ b/tests/sw_sync.c
@@ -26,6 +26,7 @@

#include <pthread.h>
#include <semaphore.h>
+#include <stdatomic.h>
#include <stdint.h>
#include <sys/socket.h>
#include <sys/types.h>
@@ -43,7 +44,7 @@ IGT_TEST_DESCRIPTION("Test SW Sync Framework");
typedef struct {
int timeline;
uint32_t thread_id;
- uint32_t *counter;
+ _Atomic(uint32_t) *counter;
sem_t *sem;
} data_t;

@@ -489,7 +490,7 @@ static void test_sync_multi_consumer(void)
pthread_t thread_arr[MULTI_CONSUMER_THREADS];
sem_t sem;
int timeline;
- uint32_t counter = 0;
+ _Atomic(uint32_t) counter = 0;
uintptr_t thread_ret = 0;
data_t data;
int i, ret;
@@ -517,7 +518,7 @@ static void test_sync_multi_consumer(void)
{
sem_wait(&sem);

- __sync_fetch_and_add(&counter, 1);
+ atomic_fetch_add(&counter, 1);
sw_sync_timeline_inc(timeline, 1);
}

@@ -554,7 +555,7 @@ static void * test_sync_multi_consumer_producer_thread(void *arg)
if (sync_fence_wait(fence, 1000) < 0)
return (void *) 1;

- if (__sync_fetch_and_add(data->counter, 1) != next_point)
+ if (atomic_fetch_add(data->counter, 1) != next_point)
return (void *) 1;

/* Kick off the next thread. */
@@ -570,7 +571,7 @@ static void test_sync_multi_consumer_producer(void)
data_t data_arr[MULTI_CONSUMER_PRODUCER_THREADS];
pthread_t thread_arr[MULTI_CONSUMER_PRODUCER_THREADS];
int timeline;
- uint32_t counter = 0;
+ _Atomic(uint32_t) counter = 0;
uintptr_t thread_ret = 0;
data_t data;
int i, ret;
@@ -900,4 +901,3 @@ igt_main
igt_subtest("sync_random_merge")
test_sync_random_merge();
}
-
--
2.20.1