diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2017-01-24 17:49:58 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2017-01-24 22:50:46 +0300 |
commit | 4949e9b8cb409288fcaa0553ead9704ca6219a23 (patch) | |
tree | c974c47343c12fb77daa8b50db88f06bba545fb6 | |
parent | 90281551455f043fc027ad98ac9e7063803b7b31 (diff) | |
download | libatomic_ops-4949e9b8cb409288fcaa0553ead9704ca6219a23.tar.gz |
Revert "Fix test_atomic fail caused unaligned AO_double_t access (VC/x86)"
This reverts commit 69c4010c1b3d43e2e179421e27379aaa5aeeb6d8.
The failure is actually caused by the fact that default alignment of
stack on x86 is 4 bytes.
So, another solution should be proposed to fix the issue for other
compilers (and, potentially, other targets). E.g. do not place
AO_double_t volatile variables on stack.
-rw-r--r-- | doc/README_win32.txt | 5 | ||||
-rw-r--r-- | src/atomic_ops/sysdeps/generic_pthread.h | 1 | ||||
-rw-r--r-- | src/atomic_ops/sysdeps/standard_ao_double_t.h | 14 | ||||
-rw-r--r-- | src/atomic_ops_malloc.c | 2 | ||||
-rw-r--r-- | src/atomic_ops_stack.h | 6 | ||||
-rw-r--r-- | tests/test_atomic_include.template | 4 | ||||
-rw-r--r-- | tests/test_stack.c | 2 |
7 files changed, 4 insertions, 30 deletions
diff --git a/doc/README_win32.txt b/doc/README_win32.txt index 4f1f281..c9e81d9 100644 --- a/doc/README_win32.txt +++ b/doc/README_win32.txt @@ -24,11 +24,6 @@ pieces from the resulting src directory contents: If the client defines AO_ASSUME_VISTA (before include atomic_ops.h), it should make double_compare_and_swap_full available. -Please note that MS compiler for x86 does not align AO_double_t on an 8-byte -boundary, thus to avoid an undefined behavior, an AO_double_t (volatile) -variable should be declared with AO_DOUBLE_ALIGN attribute if the variable -reference is passed to an AO primitive (the attribute is not applicable to -arguments and pointers). Note that the library is covered by the GNU General Public License, while the top 2 of these pieces allow use in proprietary code. diff --git a/src/atomic_ops/sysdeps/generic_pthread.h b/src/atomic_ops/sysdeps/generic_pthread.h index 2e70068..3c65624 100644 --- a/src/atomic_ops/sysdeps/generic_pthread.h +++ b/src/atomic_ops/sysdeps/generic_pthread.h @@ -367,7 +367,6 @@ typedef struct { AO_t AO_val2; } AO_double_t; #define AO_HAVE_double_t -#define AO_DOUBLE_ALIGN /* empty */ #define AO_DOUBLE_T_INITIALIZER { (AO_t)0, (AO_t)0 } diff --git a/src/atomic_ops/sysdeps/standard_ao_double_t.h b/src/atomic_ops/sysdeps/standard_ao_double_t.h index 636ba46..7d85c9d 100644 --- a/src/atomic_ops/sysdeps/standard_ao_double_t.h +++ b/src/atomic_ops/sysdeps/standard_ao_double_t.h @@ -50,25 +50,11 @@ typedef __m128 double_ptr_storage; #elif defined(_WIN32) && !defined(__GNUC__) typedef unsigned __int64 double_ptr_storage; -# ifdef _MSC_VER - /* VC++/x86 does not align __int64 properly by default, thus, */ - /* causing an undefined behavior or assertions violation in */ - /* the double-wide atomic primitives. For the proper alignment, */ - /* all variables of AO_double_t type (in the client code) those */ - /* address is passed to an AO primitive should be defined with the */ - /* given attribute. Not a part of double_ptr_storage because the */ - /* attribute cannot be applied to function parameters. */ -# define AO_DOUBLE_ALIGN __declspec(align(8)) -# endif #else typedef unsigned long long double_ptr_storage; #endif # define AO_HAVE_DOUBLE_PTR_STORAGE -#ifndef AO_DOUBLE_ALIGN -# define AO_DOUBLE_ALIGN /* empty */ -#endif - typedef union { struct { AO_t AO_v1; AO_t AO_v2; } AO_parts; /* Note that AO_v1 corresponds to the low or the high part of */ diff --git a/src/atomic_ops_malloc.c b/src/atomic_ops_malloc.c index 457d635..aae21d0 100644 --- a/src/atomic_ops_malloc.c +++ b/src/atomic_ops_malloc.c @@ -223,7 +223,7 @@ get_chunk(void) /* Object free lists. Ith entry corresponds to objects */ /* of total size 2**i bytes. */ -AO_stack_t AO_DOUBLE_ALIGN AO_free_list[LOG_MAX_SIZE+1]; +AO_stack_t AO_free_list[LOG_MAX_SIZE+1]; /* Break up the chunk, and add it to the object free list for */ /* the given size. We have exclusive access to chunk. */ diff --git a/src/atomic_ops_stack.h b/src/atomic_ops_stack.h index de41c6b..1ca5f40 100644 --- a/src/atomic_ops_stack.h +++ b/src/atomic_ops_stack.h @@ -146,11 +146,6 @@ AO_INLINE void AO_stack_init(AO_stack_t *list) AO_stack_pop_explicit_aux_acquire(&((l)->AO_ptr), &((l)->AO_aux)) #define AO_HAVE_stack_pop_acquire -#ifndef AO_DOUBLE_ALIGN - /* For AO_stack clients only. */ -# define AO_DOUBLE_ALIGN /* empty */ -#endif - # else /* Use fully non-blocking data structure, wide CAS */ #ifndef AO_HAVE_double_t @@ -161,7 +156,6 @@ AO_INLINE void AO_stack_init(AO_stack_t *list) typedef volatile AO_double_t AO_stack_t; /* AO_val1 is version, AO_val2 is pointer. */ -/* AO_stack_t variables should have AO_DOUBLE_ALIGN attribute. */ #define AO_STACK_INITIALIZER AO_DOUBLE_T_INITIALIZER diff --git a/tests/test_atomic_include.template b/tests/test_atomic_include.template index f05aba4..a9e1895 100644 --- a/tests/test_atomic_include.template +++ b/tests/test_atomic_include.template @@ -36,13 +36,13 @@ void test_atomicXX(void) # if defined(AO_HAVE_double_compare_and_swapXX) \ || defined(AO_HAVE_double_loadXX) \ || defined(AO_HAVE_double_storeXX) - AO_double_t AO_DOUBLE_ALIGN old_w; + AO_double_t old_w; AO_double_t new_w; # endif # if defined(AO_HAVE_compare_and_swap_doubleXX) \ || defined(AO_HAVE_compare_double_and_swap_doubleXX) \ || defined(AO_HAVE_double_compare_and_swapXX) - AO_double_t AO_DOUBLE_ALIGN w; + AO_double_t w; w.AO_val1 = 0; w.AO_val2 = 0; # endif diff --git a/tests/test_stack.c b/tests/test_stack.c index 3da075f..0847c11 100644 --- a/tests/test_stack.c +++ b/tests/test_stack.c @@ -79,7 +79,7 @@ typedef struct le { int data; } list_element; -AO_stack_t AO_DOUBLE_ALIGN the_list = AO_STACK_INITIALIZER; +AO_stack_t the_list = AO_STACK_INITIALIZER; void add_elements(int n) { |