2012-02-16 10:48:16 +01:00
|
|
|
/* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2006-12-27 02:23:51 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
2011-06-30 17:46:53 +02:00
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
#include "thr_template.c"
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
volatile uint32 b32;
|
|
|
|
volatile int32 c32;
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
/* add and sub a random number in a loop. Must get 0 at the end */
|
2009-10-12 11:00:39 +02:00
|
|
|
pthread_handler_t test_atomic_add(void *arg)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
Bug#22320: my_atomic-t unit test fails
Bug#52261: 64 bit atomic operations do not work on Solaris i386
gcc in debug compilation
One of the various problems was that the source operand to
CMPXCHG8b was marked as a input/output operand, causing GCC
to use the EBX register as the destination register for the
CMPXCHG8b instruction. This could lead to crashes as the EBX
register is also implicitly used by the instruction, causing
the value to be potentially garbaged and a protection fault
once the value is used to access a position in memory.
Another problem was the lack of proper clobbers for the atomic
operations and, also, a discrepancy between the implementations
for the Compare and Set operation. The specific problems are
described and fixed by Kristian Nielsen patches:
Patch: 1
Fix bugs in my_atomic_cas*(val,cmp,new) that *cmp is accessed
after CAS succeds.
In the gcc builtin implementation, problem was that *cmp was
read again after atomic CAS to check if old *val == *cmp;
this fails if CAS is successful and another thread modifies
*cmp in-between.
In the x86-gcc implementation, problem was that *cmp was set
also in the case of successful CAS; this means there is a
window where it can clobber a value written by another thread
after successful CAS.
Patch 2:
Add a GCC asm "memory" clobber to primitives that imply a
memory barrier.
This signifies to GCC that any potentially aliased memory
must be flushed before the operation, and re-read after the
operation, so that read or modification in other threads of
such memory values will work as intended.
In effect, it makes these primitives work as memory barriers
for the compiler as well as the CPU. This is better and more
correct than adding "volatile" to variables.
include/atomic/gcc_builtins.h:
Do not read from *cmp after the operation as it might be
already gone if the operation was successful.
include/atomic/nolock.h:
Prefer system provided atomics over the broken x86 asm.
include/atomic/x86-gcc.h:
Do not mark source operands as input/output operands.
Add proper memory clobbers.
include/my_atomic.h:
Add notes about my_atomic_add and my_atomic_cas behaviors.
unittest/mysys/my_atomic-t.c:
Remove work around, if it fails, there is either a problem
with the atomic operations code or the specific compiler
version should be black-listed.
2010-07-23 14:37:10 +02:00
|
|
|
int m= (*(int *)arg)/2;
|
|
|
|
int32 x;
|
2009-10-12 11:00:39 +02:00
|
|
|
for (x= ((int)(intptr)(&m)); m ; m--)
|
|
|
|
{
|
|
|
|
x= (x*m+0x87654321) & INT_MAX32;
|
|
|
|
my_atomic_add32(&bad, x);
|
|
|
|
my_atomic_add32(&bad, -x);
|
|
|
|
}
|
|
|
|
pthread_mutex_lock(&mutex);
|
|
|
|
if (!--running_threads) pthread_cond_signal(&cond);
|
|
|
|
pthread_mutex_unlock(&mutex);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
volatile int64 a64;
|
|
|
|
/* add and sub a random number in a loop. Must get 0 at the end */
|
|
|
|
pthread_handler_t test_atomic_add64(void *arg)
|
|
|
|
{
|
Bug#22320: my_atomic-t unit test fails
Bug#52261: 64 bit atomic operations do not work on Solaris i386
gcc in debug compilation
One of the various problems was that the source operand to
CMPXCHG8b was marked as a input/output operand, causing GCC
to use the EBX register as the destination register for the
CMPXCHG8b instruction. This could lead to crashes as the EBX
register is also implicitly used by the instruction, causing
the value to be potentially garbaged and a protection fault
once the value is used to access a position in memory.
Another problem was the lack of proper clobbers for the atomic
operations and, also, a discrepancy between the implementations
for the Compare and Set operation. The specific problems are
described and fixed by Kristian Nielsen patches:
Patch: 1
Fix bugs in my_atomic_cas*(val,cmp,new) that *cmp is accessed
after CAS succeds.
In the gcc builtin implementation, problem was that *cmp was
read again after atomic CAS to check if old *val == *cmp;
this fails if CAS is successful and another thread modifies
*cmp in-between.
In the x86-gcc implementation, problem was that *cmp was set
also in the case of successful CAS; this means there is a
window where it can clobber a value written by another thread
after successful CAS.
Patch 2:
Add a GCC asm "memory" clobber to primitives that imply a
memory barrier.
This signifies to GCC that any potentially aliased memory
must be flushed before the operation, and re-read after the
operation, so that read or modification in other threads of
such memory values will work as intended.
In effect, it makes these primitives work as memory barriers
for the compiler as well as the CPU. This is better and more
correct than adding "volatile" to variables.
include/atomic/gcc_builtins.h:
Do not read from *cmp after the operation as it might be
already gone if the operation was successful.
include/atomic/nolock.h:
Prefer system provided atomics over the broken x86 asm.
include/atomic/x86-gcc.h:
Do not mark source operands as input/output operands.
Add proper memory clobbers.
include/my_atomic.h:
Add notes about my_atomic_add and my_atomic_cas behaviors.
unittest/mysys/my_atomic-t.c:
Remove work around, if it fails, there is either a problem
with the atomic operations code or the specific compiler
version should be black-listed.
2010-07-23 14:37:10 +02:00
|
|
|
int m= (*(int *)arg)/2;
|
|
|
|
int64 x;
|
2009-10-12 11:00:39 +02:00
|
|
|
for (x= ((int64)(intptr)(&m)); m ; m--)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2009-10-12 11:00:39 +02:00
|
|
|
x= (x*m+0xfdecba987654321LL) & INT_MAX64;
|
|
|
|
my_atomic_add64(&a64, x);
|
|
|
|
my_atomic_add64(&a64, -x);
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
pthread_mutex_lock(&mutex);
|
2009-10-12 11:00:39 +02:00
|
|
|
if (!--running_threads)
|
|
|
|
{
|
|
|
|
bad= (a64 != 0);
|
|
|
|
pthread_cond_signal(&cond);
|
|
|
|
}
|
2006-05-31 18:44:09 +02:00
|
|
|
pthread_mutex_unlock(&mutex);
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
return 0;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
|
2006-05-31 18:44:09 +02:00
|
|
|
/*
|
|
|
|
1. generate thread number 0..N-1 from b32
|
2009-10-12 11:00:39 +02:00
|
|
|
2. add it to bad
|
2006-05-31 18:44:09 +02:00
|
|
|
3. swap thread numbers in c32
|
|
|
|
4. (optionally) one more swap to avoid 0 as a result
|
2009-10-12 11:00:39 +02:00
|
|
|
5. subtract result from bad
|
|
|
|
must get 0 in bad at the end
|
2006-05-31 18:44:09 +02:00
|
|
|
*/
|
2009-10-12 11:00:39 +02:00
|
|
|
pthread_handler_t test_atomic_fas(void *arg)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2009-10-12 11:00:39 +02:00
|
|
|
int m= *(int *)arg;
|
|
|
|
int32 x;
|
2006-06-17 16:20:39 +02:00
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
x= my_atomic_add32(&b32, 1);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
my_atomic_add32(&bad, x);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
for (; m ; m--)
|
2009-10-12 11:00:39 +02:00
|
|
|
x= my_atomic_fas32(&c32, x);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
if (!x)
|
2009-10-12 11:00:39 +02:00
|
|
|
x= my_atomic_fas32(&c32, x);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
my_atomic_add32(&bad, -x);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
pthread_mutex_lock(&mutex);
|
2009-10-12 11:00:39 +02:00
|
|
|
if (!--running_threads) pthread_cond_signal(&cond);
|
2006-05-31 18:44:09 +02:00
|
|
|
pthread_mutex_unlock(&mutex);
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
return 0;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2009-10-12 11:00:39 +02:00
|
|
|
same as test_atomic_add, but my_atomic_add32 is emulated with
|
|
|
|
my_atomic_cas32 - notice that the slowdown is proportional to the
|
|
|
|
number of CPUs
|
2006-05-31 18:44:09 +02:00
|
|
|
*/
|
2009-10-12 11:00:39 +02:00
|
|
|
pthread_handler_t test_atomic_cas(void *arg)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
Bug#22320: my_atomic-t unit test fails
Bug#52261: 64 bit atomic operations do not work on Solaris i386
gcc in debug compilation
One of the various problems was that the source operand to
CMPXCHG8b was marked as a input/output operand, causing GCC
to use the EBX register as the destination register for the
CMPXCHG8b instruction. This could lead to crashes as the EBX
register is also implicitly used by the instruction, causing
the value to be potentially garbaged and a protection fault
once the value is used to access a position in memory.
Another problem was the lack of proper clobbers for the atomic
operations and, also, a discrepancy between the implementations
for the Compare and Set operation. The specific problems are
described and fixed by Kristian Nielsen patches:
Patch: 1
Fix bugs in my_atomic_cas*(val,cmp,new) that *cmp is accessed
after CAS succeds.
In the gcc builtin implementation, problem was that *cmp was
read again after atomic CAS to check if old *val == *cmp;
this fails if CAS is successful and another thread modifies
*cmp in-between.
In the x86-gcc implementation, problem was that *cmp was set
also in the case of successful CAS; this means there is a
window where it can clobber a value written by another thread
after successful CAS.
Patch 2:
Add a GCC asm "memory" clobber to primitives that imply a
memory barrier.
This signifies to GCC that any potentially aliased memory
must be flushed before the operation, and re-read after the
operation, so that read or modification in other threads of
such memory values will work as intended.
In effect, it makes these primitives work as memory barriers
for the compiler as well as the CPU. This is better and more
correct than adding "volatile" to variables.
include/atomic/gcc_builtins.h:
Do not read from *cmp after the operation as it might be
already gone if the operation was successful.
include/atomic/nolock.h:
Prefer system provided atomics over the broken x86 asm.
include/atomic/x86-gcc.h:
Do not mark source operands as input/output operands.
Add proper memory clobbers.
include/my_atomic.h:
Add notes about my_atomic_add and my_atomic_cas behaviors.
unittest/mysys/my_atomic-t.c:
Remove work around, if it fails, there is either a problem
with the atomic operations code or the specific compiler
version should be black-listed.
2010-07-23 14:37:10 +02:00
|
|
|
int m= (*(int *)arg)/2, ok= 0;
|
|
|
|
int32 x, y;
|
2009-10-12 11:00:39 +02:00
|
|
|
for (x= ((int)(intptr)(&m)); m ; m--)
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2009-10-12 11:00:39 +02:00
|
|
|
y= my_atomic_load32(&bad);
|
|
|
|
x= (x*m+0x87654321) & INT_MAX32;
|
2006-06-17 16:20:39 +02:00
|
|
|
do {
|
2009-10-12 11:00:39 +02:00
|
|
|
ok= my_atomic_cas32(&bad, &y, (uint32)y+x);
|
|
|
|
} while (!ok) ;
|
2006-06-17 16:20:39 +02:00
|
|
|
do {
|
2009-10-12 11:00:39 +02:00
|
|
|
ok= my_atomic_cas32(&bad, &y, y-x);
|
|
|
|
} while (!ok) ;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
pthread_mutex_lock(&mutex);
|
2009-10-12 11:00:39 +02:00
|
|
|
if (!--running_threads) pthread_cond_signal(&cond);
|
2006-05-31 18:44:09 +02:00
|
|
|
pthread_mutex_unlock(&mutex);
|
unittest:
rename *.t* to *-t* to be automake-friendly
simplify Makefiles
test_atomic.c:
move to unittest, add GPL comment, fix warnings, convert to tap framework.
configure:
remove custom tests for available types, use AC_CHECK_TYPE instead
x86-gcc.h:
fix gcc -ansi errors while maintaining readability
ignore:
added *-t
unittest/mysys/base64-t.c:
Rename: unittest/mysys/base64.t.c -> unittest/mysys/base64-t.c
unittest/mysys/bitmap-t.c:
Rename: unittest/mysys/bitmap.t.c -> unittest/mysys/bitmap-t.c
unittest/mytap/t/basic-t.c:
Rename: unittest/mytap/t/basic.t.c -> unittest/mytap/t/basic-t.c
unittest/examples/no_plan-t.c:
Rename: unittest/examples/no_plan.t.c -> unittest/examples/no_plan-t.c
unittest/examples/simple-t.c:
Rename: unittest/examples/simple.t.c -> unittest/examples/simple-t.c
unittest/examples/skip-t.c:
Rename: unittest/examples/skip.t.c -> unittest/examples/skip-t.c
unittest/examples/skip_all-t.c:
Rename: unittest/examples/skip_all.t.c -> unittest/examples/skip_all-t.c
unittest/examples/todo-t.c:
Rename: unittest/examples/todo.t.c -> unittest/examples/todo-t.c
BitKeeper/etc/ignore:
added *-t
config/ac-macros/misc.m4:
remove custom AC_TRY_RUN tests for available types, use AC_CHECK_TYPE instead
configure.in:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/atomic/x86-gcc.h:
fix gcc -ansi errors while maintaining readability
include/my_global.h:
remove custom tests for available types, use AC_CHECK_TYPE instead
include/my_sys.h:
add missing declaration
mysys/Makefile.am:
move test_atomic to unittest
unittest/Makefile.am:
simplifications, correct permissions in chmod
unittest/README.txt:
rename *.t* to *-t* to be automake-friendly
unittest/examples/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/mysys/my_atomic-t.c:
move mysys/test_atomic.c to unittest, add GPL comment, fix warnings,
convert to tap framework.
unittest/mytap/t/Makefile.am:
rename *.t* to *-t* to be automake-friendly
simplify Makefile
unittest/unit.pl:
rename *.t* to *-t* to be automake-friendly
2006-06-01 12:25:47 +02:00
|
|
|
return 0;
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
void do_tests()
|
2006-05-31 18:44:09 +02:00
|
|
|
{
|
2009-10-12 11:00:39 +02:00
|
|
|
plan(6);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
bad= my_atomic_initialize();
|
|
|
|
ok(!bad, "my_atomic_initialize() returned %d", bad);
|
2006-05-31 18:44:09 +02:00
|
|
|
|
|
|
|
|
2009-10-12 11:00:39 +02:00
|
|
|
b32= c32= 0;
|
|
|
|
test_concurrently("my_atomic_add32", test_atomic_add, THREADS, CYCLES);
|
|
|
|
b32= c32= 0;
|
|
|
|
test_concurrently("my_atomic_fas32", test_atomic_fas, THREADS, CYCLES);
|
|
|
|
b32= c32= 0;
|
|
|
|
test_concurrently("my_atomic_cas32", test_atomic_cas, THREADS, CYCLES);
|
|
|
|
|
|
|
|
{
|
2011-10-03 09:31:55 +02:00
|
|
|
/*
|
|
|
|
If b is not volatile, the wrong assembly code is generated on OSX Lion
|
|
|
|
as the variable is optimized away as a constant.
|
|
|
|
See Bug#62533 / Bug#13030056.
|
|
|
|
Another workaround is to specify architecture explicitly using e.g.
|
|
|
|
CFLAGS/CXXFLAGS= "-m64".
|
|
|
|
*/
|
|
|
|
volatile int64 b=0x1000200030004000LL;
|
2009-10-12 11:00:39 +02:00
|
|
|
a64=0;
|
|
|
|
my_atomic_add64(&a64, b);
|
|
|
|
ok(a64==b, "add64");
|
|
|
|
}
|
|
|
|
a64=0;
|
|
|
|
test_concurrently("my_atomic_add64", test_atomic_add64, THREADS, CYCLES);
|
2006-05-31 18:44:09 +02:00
|
|
|
}
|