From 02f926c2c7fcfb2f410811908d168aba38df7591 Mon Sep 17 00:00:00 2001 From: William Woodall Date: Sat, 12 Dec 2015 12:12:48 -0800 Subject: [PATCH] fixes while testing on Windows --- rcl/src/rcl/rcl.c | 8 ++-- rcl/src/rcl/stdatomic_helper.h | 29 ++++++++++-- .../rcl/stdatomic_helper/win32/stdatomic.h | 47 ++++++++++++++----- rcl/src/rcl/time_win32.c | 2 +- rcl/src/rcl/wait.c | 15 +++--- 5 files changed, 71 insertions(+), 30 deletions(-) diff --git a/rcl/src/rcl/rcl.c b/rcl/src/rcl/rcl.c index 7fc8745..72a8a12 100644 --- a/rcl/src/rcl/rcl.c +++ b/rcl/src/rcl/rcl.c @@ -28,7 +28,7 @@ static atomic_bool __rcl_is_initialized = ATOMIC_VAR_INIT(false); static rcl_allocator_t __rcl_allocator = {0}; static int __rcl_argc = 0; static char ** __rcl_argv = NULL; -static atomic_uint_fast64_t __rcl_instance_id = ATOMIC_VAR_INIT(0); +static atomic_uint_least64_t __rcl_instance_id = ATOMIC_VAR_INIT(0); static uint64_t __rcl_next_unique_id = 0; static void @@ -49,9 +49,7 @@ __clean_up_init() rcl_ret_t rcl_init(int argc, char ** argv, rcl_allocator_t allocator) { - bool was_initialized; - rcl_atomic_exchange(&__rcl_is_initialized, was_initialized, true); - if (was_initialized) { + if (rcl_atomic_exchange_bool(&__rcl_is_initialized, true)) { RCL_SET_ERROR_MSG("rcl_init called while already initialized"); return RCL_RET_ALREADY_INIT; } @@ -66,7 +64,7 @@ rcl_init(int argc, char ** argv, rcl_allocator_t allocator) memset(__rcl_argv, 0, sizeof(char **) * argc); for (size_t i = 0; i < argc; ++i) { __rcl_argv[i] = (char *)__rcl_allocator.allocate(strlen(argv[i]), __rcl_allocator.state); - strcpy(__rcl_argv[i], argv[i]); // NOLINT(runtime/printf) + memcpy(__rcl_argv[i], argv[i], strlen(argv[i])); } rcl_atomic_store(&__rcl_instance_id, ++__rcl_next_unique_id); if (rcl_atomic_load_uint64_t(&__rcl_instance_id) == 0) { diff --git a/rcl/src/rcl/stdatomic_helper.h b/rcl/src/rcl/stdatomic_helper.h index 913e438..fef4bff 100644 --- a/rcl/src/rcl/stdatomic_helper.h +++ b/rcl/src/rcl/stdatomic_helper.h @@ -28,14 +28,25 @@ #define rcl_atomic_store(object, desired) atomic_store(object, desired) -#else +#else // !defined(WIN32) -#endif +#include "./stdatomic_helper/win32/stdatomic.h" + +#define rcl_atomic_load(object, out) rcl_win32_atomic_load(object, out) + +#define rcl_atomic_compare_exchange_strong(object, out, expected, desired) \ + rcl_win32_atomic_compare_exchange_strong(object, out, expected, desired) + +#define rcl_atomic_exchange(object, out, desired) rcl_win32_atomic_exchange(object, out, desired) + +#define rcl_atomic_store(object, desired) rcl_win32_atomic_store(object, desired) + +#endif // !defined(WIN32) static inline bool rcl_atomic_load_bool(atomic_bool * a_bool) { - bool result; + bool result = false; rcl_atomic_load(a_bool, result); return result; } @@ -43,7 +54,7 @@ rcl_atomic_load_bool(atomic_bool * a_bool) static inline uint64_t rcl_atomic_load_uint64_t(atomic_uint_least64_t * a_uint64_t) { - uint64_t result; + uint64_t result = 0; rcl_atomic_load(a_uint64_t, result); return result; } @@ -51,7 +62,7 @@ rcl_atomic_load_uint64_t(atomic_uint_least64_t * a_uint64_t) static inline uintptr_t rcl_atomic_load_uintptr_t(atomic_uintptr_t * a_uintptr_t) { - uintptr_t result; + uintptr_t result = 0; rcl_atomic_load(a_uintptr_t, result); return result; } @@ -65,6 +76,14 @@ rcl_atomic_compare_exchange_strong_uint_least64_t( return result; } +static inline bool +rcl_atomic_exchange_bool(atomic_bool * a_bool, bool desired) +{ + bool result; + rcl_atomic_exchange(a_bool, result, desired); + return result; +} + static inline uint64_t rcl_atomic_exchange_uint64_t(atomic_uint_least64_t * a_uint64_t, uint64_t desired) { diff --git a/rcl/src/rcl/stdatomic_helper/win32/stdatomic.h b/rcl/src/rcl/stdatomic_helper/win32/stdatomic.h index 42b6f74..c346025 100644 --- a/rcl/src/rcl/stdatomic_helper/win32/stdatomic.h +++ b/rcl/src/rcl/stdatomic_helper/win32/stdatomic.h @@ -188,26 +188,31 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; */ #define rcl_win32_atomic_compare_exchange_strong(object, out, expected, desired) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ - out = _InterlockedCompareExchange64((LONGLONG *) object, desired, expected); \ + out = _InterlockedCompareExchange64((LONGLONG *) object, desired, *expected); \ break; \ case sizeof(uint32_t): \ - out = _InterlockedCompareExchange((LONG *) object, desired, expected); \ + out = _InterlockedCompareExchange((LONG *) object, desired, *expected); \ break; \ case sizeof(uint16_t): \ - out = _InterlockedCompareExchange16((SHORT *) object, desired, expected); \ + out = _InterlockedCompareExchange16((SHORT *) object, desired, *expected); \ break; \ default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) #define rcl_win32_atomic_compare_exchange_weak(object, out, expected, desired) \ rcl_win32_atomic_compare_exchange_strong(object, out, expected, desired) -#define rcl_win32_atomic_exchange((object), out, desired) \ +#define rcl_win32_atomic_exchange(object, out, desired) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ @@ -222,9 +227,12 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) #define rcl_win32_atomic_fetch_add(object, out, operand) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ @@ -239,9 +247,12 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) #define rcl_win32_atomic_fetch_and(object, out, operand) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ @@ -256,9 +267,12 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) #define rcl_win32_atomic_fetch_or(object, out, operand) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ @@ -273,12 +287,15 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) #define rcl_win32_atomic_fetch_sub(object, out, operand) \ rcl_win32_atomic_fetch_add(object, out, -(operand)) #define rcl_win32_atomic_fetch_xor(object, out, operand) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ @@ -293,9 +310,12 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) -#define rcl_win32_atomic_load(object) \ +#define rcl_win32_atomic_load(object, out) \ + __pragma(warning( push )) \ + __pragma(warning( disable : 4244 )) \ do { \ switch (sizeof(object)) { \ case sizeof(uint64_t): \ @@ -310,12 +330,13 @@ typedef _Atomic (uintmax_t) atomic_uintmax_t; default: \ break; \ } \ - } while (0) + } while (0) \ + __pragma(warning( pop )) #define rcl_win32_atomic_store(object, desired) \ do { \ MemoryBarrier(); \ - object = (desired); \ + (object)->__val = (desired); \ MemoryBarrier(); \ } while (0) diff --git a/rcl/src/rcl/time_win32.c b/rcl/src/rcl/time_win32.c index 55c03e5..8db5d26 100644 --- a/rcl/src/rcl/time_win32.c +++ b/rcl/src/rcl/time_win32.c @@ -124,7 +124,7 @@ rcl_ret_t rcl_steady_time_point_now(rcl_steady_time_point_t * now) { RCL_CHECK_ARGUMENT_FOR_NULL(now, RCL_RET_INVALID_ARGUMENT); - WINAPI ret = QueryPerformanceFrequency(); + // WINAPI ret = QueryPerformanceFrequency(); return RCL_RET_OK; } diff --git a/rcl/src/rcl/wait.c b/rcl/src/rcl/wait.c index b41fb75..9e6589f 100644 --- a/rcl/src/rcl/wait.c +++ b/rcl/src/rcl/wait.c @@ -194,7 +194,10 @@ rcl_wait_set_get_allocator(const rcl_wait_set_t * wait_set, rcl_allocator_t * al RCL_SET_ERROR_MSG("wait set is invalid"); \ return RCL_RET_WAIT_SET_INVALID; \ } \ - memset(wait_set->Type ## s, 0, sizeof(rcl_ ## Type ## _t *) * wait_set->size_of_ ## Type ## s); \ + memset( \ + (void *)wait_set->Type ## s, \ + 0, \ + sizeof(rcl_ ## Type ## _t *) * wait_set->size_of_ ## Type ## s); \ wait_set->impl->Type ## _index = 0; \ #define SET_CLEAR_RMW(Type, RMWStorage, RMWCount) \ @@ -214,14 +217,14 @@ rcl_wait_set_get_allocator(const rcl_wait_set_t * wait_set, rcl_allocator_t * al rcl_allocator_t allocator = wait_set->impl->allocator; \ if (size == 0) { \ if (wait_set->Type ## s) { \ - allocator.deallocate(wait_set->Type ## s, allocator.state); \ + allocator.deallocate((void *)wait_set->Type ## s, allocator.state); \ wait_set->Type ## s = NULL; \ } \ ExtraDealloc \ } else { \ wait_set->size_of_ ## Type ## s = 0; \ wait_set->Type ## s = (const rcl_ ## Type ## _t * *)allocator.reallocate( \ - wait_set->Type ## s, sizeof(rcl_ ## Type ## _t *) * size, allocator.state); \ + (void *)wait_set->Type ## s, sizeof(rcl_ ## Type ## _t *) * size, allocator.state); \ RCL_CHECK_FOR_NULL_WITH_MSG( \ wait_set->Type ## s, "allocating memory failed", return RCL_RET_BAD_ALLOC); \ wait_set->size_of_ ## Type ## s = size; \ @@ -232,7 +235,7 @@ rcl_wait_set_get_allocator(const rcl_wait_set_t * wait_set, rcl_allocator_t * al #define SET_RESIZE_RMW_DEALLOC(RMWStorage, RMWCount) \ /* Also deallocate the rmw storage. */ \ if (wait_set->impl->RMWStorage) { \ - allocator.deallocate(wait_set->impl->RMWStorage, allocator.state); \ + allocator.deallocate((void *)wait_set->impl->RMWStorage, allocator.state); \ wait_set->impl->RMWStorage = NULL; \ } @@ -242,7 +245,7 @@ rcl_wait_set_get_allocator(const rcl_wait_set_t * wait_set, rcl_allocator_t * al wait_set->impl->RMWStorage = (void **)allocator.reallocate( \ wait_set->impl->RMWStorage, sizeof(rcl_ ## Type ## _t *) * size, allocator.state); \ if (!wait_set->impl->RMWStorage) { \ - allocator.deallocate(wait_set->Type ## s, allocator.state); \ + allocator.deallocate((void *)wait_set->Type ## s, allocator.state); \ wait_set->size_of_ ## Type ## s = 0; \ RCL_SET_ERROR_MSG("allocating memory failed"); \ return RCL_RET_BAD_ALLOC; \ @@ -375,7 +378,7 @@ rcl_wait(rcl_wait_set_t * wait_set, int64_t timeout) if (ret != RCL_RET_OK) { return ret; // The rcl error state should already be set. } - if (timer_timeout < min_timeout) { + if ((uint64_t)timer_timeout < min_timeout) { min_timeout = timer_timeout; } }