Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This project partially comply with [Semantic Versioning][].
## Unreleased

- Fixed warnings for code using vatomic C++
- Fixed warnings for C99. Except for dispatch.h, vatomic is now C99 compliant.

## [2.4.0]

Expand Down
27 changes: 4 additions & 23 deletions include/vsync/atomic/internal/macros.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved.
* Copyright (C) Huawei Technologies Co., Ltd. 2023-2025. All rights reserved.
* SPDX-License-Identifier: MIT
*/

Expand Down Expand Up @@ -84,7 +84,7 @@
* @param T target type vatomic32_t, vuint32_t, vuint64_t, void*, ...
* @param v value to cast
******************************************************************************/
#define V_CAST(T, v) ((V_CAST_UNION(T, __typeof__(v))){.in = v}.out)
#define V_CAST(T, v) ((V_CAST_UNION(T, __typeof__((v)))){.in = (v)}.out)

/*******************************************************************************
* @def V_CAST_UNION
Expand All @@ -98,30 +98,11 @@
******************************************************************************/
#define V_CAST_UNION(out_type, in_type) \
union { \
vuint64_t clear; \
\
V_ASSERT(sizeof(out_type) <= sizeof(vuint64_t), out_larger_than64); \
V_ASSERT(sizeof(in_type) <= sizeof(vuint64_t), in_larger_than64); \
\
vuint64_t clear; \
out_type out; \
struct { \
char pad[V_CAST_PAD_SIZE(out_type, in_type)]; \
in_type in; \
}; \
in_type in; \
}

/* size greater or equal */
#define V_CAST_SZGE(out_type, in_type) (sizeof(out_type) >= sizeof(in_type))

/* size difference */
#define V_CAST_SZDIFF(out_type, in_type) (sizeof(out_type) - sizeof(in_type))

/* padding for big endian */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define V_CAST_PAD_SIZE(out_type, in_type) 0
#else
#define V_CAST_PAD_SIZE(out_type, in_type) \
(V_CAST_SZGE(out_type, in_type) ? V_CAST_SZDIFF(out_type, in_type) : 0)
#endif

#endif /* VATOMIC_INTERNAL_MACROS_H */
6 changes: 3 additions & 3 deletions include/vsync/common/macros.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved.
* Copyright (C) Huawei Technologies Co., Ltd. 2023-2025. All rights reserved.
* SPDX-License-Identifier: MIT
*/

Expand Down Expand Up @@ -38,7 +38,7 @@

#define V_NR_VARS_(m, a, b, c, d, e, f, g, h, i, j, k, n, ...) m##n
#define V_NR_VARS(m, ...) \
V_NR_VARS_(m, ##__VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
V_NR_VARS_(m, __VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

/*******************************************************************************
* unused args
Expand Down Expand Up @@ -125,7 +125,7 @@
*/
#define V_UNUSED(...) \
do { \
V_NR_VARS(V_UNUSED_, ##__VA_ARGS__)(__VA_ARGS__); \
V_NR_VARS(V_UNUSED_, __VA_ARGS__)(__VA_ARGS__); \
} while (0)

/**
Expand Down
76 changes: 41 additions & 35 deletions template/test-atomic/mt_test_await_TY.c.in
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ _tmpl_end;
#include <vsync/atomic.h>
/* keep number of threads even */
_tmpl_begin(TY = [[u8; u16; u32; u64]]);
#define IT 10
#define IT 10
#define V_DOUBLE(_v_) ((_v_) * 2)
_tmpl_end;
#define MAX_THREADS 10
Expand Down Expand Up @@ -39,6 +39,11 @@ _tmpl_map(MAP_CAST_u8, );
_tmpl_map(MAP_CAST_u16, );
_tmpl_map(MAP_CAST_u32, );
_tmpl_map(MAP_CAST_u64, );
_tmpl_map(MAP_TP_ptr, vuintptr_t);
_tmpl_map(MAP_TP_u8, TT);
_tmpl_map(MAP_TP_u16, TT);
_tmpl_map(MAP_TP_u32, TT);
_tmpl_map(MAP_TP_u64, TT);
_tmpl_dl; // -------------------------------------------------------------------
_tmpl_dl; // Mid vals
_tmpl_dl; // -------------------------------------------------------------------
Expand Down Expand Up @@ -76,8 +81,9 @@ static inline void *
mt_atomic_TY_await_OP_MS_run(void *args)
{
vsize_t tid = (vsize_t)(vuintptr_t)args;
(void)__vatomic_await_OP_MS(&g_shared, MAP_CAST_TY(MAP_MID_TY + (TT)tid));
__vatomic_write(&g_shared, MAP_CAST_TY(MAP_MID_TY + (TT)tid + 1U));
(void)__vatomic_await_OP_MS(&g_shared,
MAP_CAST_TY(MAP_MID_TY + (MAP_TP_TY)tid));
__vatomic_write(&g_shared, MAP_CAST_TY(MAP_MID_TY + (MAP_TP_TY)tid + 1U));
return NULL;
}
static inline void
Expand All @@ -86,7 +92,7 @@ mt_atomic_TY_await_OP_MS(void)
__vatomic_init(&g_shared, MAP_CAST_TY MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_OP_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_OP_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand All @@ -98,7 +104,7 @@ _tmpl_dl; // -------------------------------------------------------------------
_tmpl_dl; // await eq_add, eq_set
_tmpl_dl; // -------------------------------------------------------------------
_tmpl_map(MAP_NEW_VAl_add, 1);
_tmpl_map(MAP_NEW_VAl_set, (MAP_MID_TY + (TT)tid + 1));
_tmpl_map(MAP_NEW_VAl_set, (MAP_MID_TY + (MAP_TP_TY)tid + 1));
_tmpl_begin(TY = [[u8; u16; u32; u64; ptr]], MO = [[seq]], OP = [[add; set]],
$F_ptr_set = BLK_KEEP, $F_ptr = BLK_SKIP);
$F_TY_OP;
Expand All @@ -108,8 +114,8 @@ $F_TY_OP;
static inline void *
mt_atomic_TY_await_eq_OP_MS_run(void *args)
{
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT await_val = MAP_CAST_TY(MAP_MID_TY + (TT)tid);
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT await_val = MAP_CAST_TY(MAP_MID_TY + (MAP_TP_TY)tid);
TT new_val = MAP_CAST_TY(MAP_NEW_VAl_OP);
(void)__vatomic_await_eq_OP_MS(&g_shared, await_val, new_val);
return NULL;
Expand All @@ -120,7 +126,7 @@ mt_atomic_TY_await_eq_OP_MS(void)
__vatomic_init(&g_shared, MAP_CAST_TY MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_eq_OP_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_eq_OP_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand All @@ -138,8 +144,8 @@ _tmpl_begin(TY = [[u8; u16; u32; u64]], MO = [[seq]], OP = [[sub]]);
static inline void *
mt_atomic_TY_await_eq_OP_MS_run(void *args)
{
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = (MAP_MID_TY + MAX_THREADS) - (TT)tid;
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = (MAP_MID_TY + MAX_THREADS) - (MAP_TP_TY)tid;
(void)__vatomic_await_eq_OP_MS(&g_shared, wait_val, 1);
return NULL;
}
Expand All @@ -149,7 +155,7 @@ mt_atomic_TY_await_eq_OP_MS(void)
__vatomic_init(&g_shared, MAP_MID_TY + MAX_THREADS);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_eq_OP_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_eq_OP_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand Down Expand Up @@ -206,7 +212,7 @@ mt_atomic_TY_await_COND_MS(void)
__vatomic_init(&g_shared, MAP_CAST_TY MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand Down Expand Up @@ -239,7 +245,7 @@ mt_atomic_TY_await_COND_MS(void)
__vatomic_init(&g_shared, NULL);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand All @@ -261,7 +267,7 @@ mt_atomic_TY_await_COND_add_MS_waiter(void)
{
TT await_val = 0;
for (TT i = 0; i < IT; i++) {
await_val = (MAP_MID_TY MAP_AWAIT_OP_COND i) MAP_AWAIT_OP_COND 1;
await_val = (MAP_MID_TY MAP_AWAIT_OP_COND i)MAP_AWAIT_OP_COND 1;
(void)__vatomic_await_COND_add_MS(&g_shared, await_val, 1);
}
}
Expand Down Expand Up @@ -290,12 +296,12 @@ mt_atomic_TY_await_COND_add_MS(void)
__vatomic_init(&g_shared, MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_add_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_add_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
TT expected =
(MAP_MID_TY MAP_AWAIT_OP_COND(MAX_THREADS * IT)) + ((MAX_THREADS / 2) * IT);
TT cur = __vatomic_read(&g_shared);
TT expected = (MAP_MID_TY MAP_AWAIT_OP_COND(MAX_THREADS * IT)) +
((MAX_THREADS / 2) * IT);
assert(cur == expected);
V_UNUSED(cur, expected);
}
Expand Down Expand Up @@ -338,7 +344,7 @@ mt_atomic_TY_await_COND_sub_MS(void)
__vatomic_init(&g_shared, MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_sub_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_sub_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand Down Expand Up @@ -385,7 +391,7 @@ mt_atomic_TY_await_COND_sub_MS(void)
__vatomic_init(&g_shared, MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_sub_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_sub_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand All @@ -404,8 +410,8 @@ _tmpl_begin(TY = [[u8; u16; u32; u64]], MO = [[seq]], COND = [[gt]]);
static inline void *
mt_atomic_TY_await_COND_set_MS_run(void *args)
{
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = MAP_MID_TY + (TT)tid;
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = MAP_MID_TY + (MAP_TP_TY)tid;
TT set_val = wait_val + 2;
(void)__vatomic_await_COND_set_MS(&g_shared, wait_val, set_val);
return NULL;
Expand All @@ -417,11 +423,11 @@ mt_atomic_TY_await_COND_set_MS(void)
__vatomic_init(&g_shared, init_val);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
TT expected = init_val + (TT)MAX_THREADS;
TT expected = init_val + (MAP_TP_TY)MAX_THREADS;
assert(cur == expected);
V_UNUSED(cur, expected);
}
Expand All @@ -436,8 +442,8 @@ _tmpl_begin(TY = [[u8; u16; u32; u64]], MO = [[seq]], COND = [[ge]]);
static inline void *
mt_atomic_TY_await_COND_set_MS_run(void *args)
{
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = MAP_MID_TY + (TT)tid;
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = MAP_MID_TY + (MAP_TP_TY)tid;
TT set_val = wait_val + 1;
(void)__vatomic_await_COND_set_MS(&g_shared, wait_val, set_val);
return NULL;
Expand All @@ -449,11 +455,11 @@ mt_atomic_TY_await_COND_set_MS(void)
__vatomic_init(&g_shared, init_val);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
TT expected = init_val + (TT)MAX_THREADS;
TT expected = init_val + (MAP_TP_TY)MAX_THREADS;
assert(cur == expected);
V_UNUSED(cur, expected);
}
Expand All @@ -468,8 +474,8 @@ _tmpl_begin(TY = [[u8; u16; u32; u64]], MO = [[seq]], COND = [[lt]]);
static inline void *
mt_atomic_TY_await_COND_set_MS_run(void *args)
{
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = MAP_MID_TY - (TT)tid;
vsize_t tid = (vsize_t)(vuintptr_t)args;
TT wait_val = MAP_MID_TY - (MAP_TP_TY)tid;
TT set_val = wait_val - 2;
(void)__vatomic_await_COND_set_MS(&g_shared, wait_val, set_val);
return NULL;
Expand All @@ -480,11 +486,11 @@ mt_atomic_TY_await_COND_set_MS(void)
__vatomic_init(&g_shared, MAP_MID_TY - 1);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
TT expected = (MAP_MID_TY - 1) - (TT)MAX_THREADS;
TT expected = (MAP_MID_TY - 1) - (MAP_TP_TY)MAX_THREADS;
assert(cur == expected);
V_UNUSED(cur, expected);
}
Expand All @@ -502,10 +508,10 @@ mt_atomic_TY_await_COND_set_MS_run(void *args)
vsize_t tid = (vsize_t)(vuintptr_t)args;
if (IS_EVEN(tid)) {
(void)__vatomic_await_COND_set_MS(&g_shared, MAP_CAST_TY MAP_MID_TY,
MAP_CAST_TY MAP_MID_TY);
MAP_CAST_TY MAP_MID_TY);
} else {
(void)__vatomic_await_COND_set_MS(&g_shared, MAP_CAST_TY ~MAP_MID_TY,
MAP_CAST_TY ~MAP_MID_TY);
MAP_CAST_TY ~MAP_MID_TY);
}
return NULL;
}
Expand All @@ -515,7 +521,7 @@ mt_atomic_TY_await_COND_set_MS(void)
__vatomic_init(&g_shared, MAP_CAST_TY MAP_MID_TY);
pthread_t t[MAX_THREADS];
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void*)i);
pthread_create(&t[i], 0, mt_atomic_TY_await_COND_set_MS_run, (void *)i);
for (vsize_t i = 0; i < MAX_THREADS; i++)
pthread_join(t[i], 0);
TT cur = __vatomic_read(&g_shared);
Expand Down
7 changes: 7 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
# SPDX-License-Identifier: MIT
target_compile_definitions(vatomic INTERFACE _GNU_SOURCE)

# All C code is C99 compliant expect for the dispatch macro.
set(TEST_C_WARN_OPTS -Wall -Wextra -Werror -Wpedantic)

# When a test uses dispatch macro with c99, we require C_EXTENSIONS and then we
# do not use -Wpedantic.
set(TEST_C_EXTENSIONS_WARN_OPTS -Wall -Wextra -Werror)

if(CMAKE_SYSTEM_PROCESSOR MATCHES riscv)
# 8- and 16-bit atomics are taken from the platform's libatomic library.
link_libraries(atomic)
Expand Down
6 changes: 4 additions & 2 deletions test/atomics/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ set(VATOMIC_INC "$<$<BOOL:${include_prop}>:-I$<JOIN:${include_prop},;-I>>")

add_executable(vatomic_pause pause_test.c)
target_link_libraries(vatomic_pause vatomic)
target_compile_options(vatomic_pause PRIVATE ${TEST_C_WARN_OPTS})
v_add_bin_test(NAME vatomic-pause COMMAND vatomic_pause)

# ##############################################################################
Expand Down Expand Up @@ -54,6 +55,7 @@ endforeach(CONFIG)

add_executable(vatomic_compile_c vatomic_empty.c)
target_link_libraries(vatomic_compile_c vatomic)
target_compile_options(vatomic_compile_c PRIVATE ${TEST_C_WARN_OPTS})
v_add_bin_test(NAME vatomic-compile-c COMMAND vatomic_compile_c)

# ##############################################################################
Expand Down Expand Up @@ -171,14 +173,14 @@ add_custom_target(expand ALL
# test vatomic dispatcher
# ##############################################################################
add_executable(dispatcher_test dispatcher_test.c)
target_compile_options(dispatcher_test PUBLIC ${TEST_OPTS})
target_compile_options(dispatcher_test PRIVATE ${TEST_C_EXTENSIONS_WARN_OPTS})
target_link_libraries(dispatcher_test vatomic)
v_add_bin_test(NAME dispatcher_test COMMAND dispatcher_test)
# ##############################################################################
# test freestanding
# ##############################################################################
add_executable(freestanding_test freestanding_test.c)
target_compile_options(freestanding_test PUBLIC ${TEST_OPTS} -nostdinc)
target_compile_options(freestanding_test PUBLIC ${TEST_C_WARN_OPTS} -nostdinc)
configure_file(include/vfreestanding.h.tpl include/vfreestanding.h)
target_include_directories(freestanding_test
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include)
Expand Down
6 changes: 6 additions & 0 deletions test/atomics_basic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,12 @@ foreach(TC_VARIANT ${TC_VARIANTS})
configure_file(vatomic_basic.c.in ${TC}.c)
add_executable(${TC} ${TC}.c)
target_link_libraries(${TC} vatomic pthread)
if(${TC_VARIANT} STREQUAL dispatch)
target_compile_options(
${TC} PRIVATE ${TEST_C_EXTENSIONS_WARN_OPTS})
else()
target_compile_options(${TC} PRIVATE ${TEST_C_WARN_OPTS})
endif()

v_add_bin_test(NAME ${TC} COMMAND ${TC})
endforeach()
Expand Down
Loading