summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2017-01-24 17:49:58 +0300
committerIvan Maidanski <ivmai@mail.ru>2017-01-24 22:50:46 +0300
commit4949e9b8cb409288fcaa0553ead9704ca6219a23 (patch)
treec974c47343c12fb77daa8b50db88f06bba545fb6
parent90281551455f043fc027ad98ac9e7063803b7b31 (diff)
downloadlibatomic_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.txt5
-rw-r--r--src/atomic_ops/sysdeps/generic_pthread.h1
-rw-r--r--src/atomic_ops/sysdeps/standard_ao_double_t.h14
-rw-r--r--src/atomic_ops_malloc.c2
-rw-r--r--src/atomic_ops_stack.h6
-rw-r--r--tests/test_atomic_include.template4
-rw-r--r--tests/test_stack.c2
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)
{