Here are the results of my collection of compilers.
I found the following:
* gcc 4.1 on 32 bit ppc does not define any __GCC_HAVE_SYNC_COMPARE_AND_SWAP_x macro but supports __sync_val_compare_and_swap_4 but not data size 1, 2, or 8
* gcc 4.2 on 32 bit ppc does not define any __GCC_HAVE_SYNC_COMPARE_AND_SWAP_x macro but supports supports data size 1, 2, and 4 but not 8.
* gcc 4.3 on 32 bit architectures define the macros for data sizes 1, 2, and 4 but not 8 and support __sync_val_compare_and_swap accordingly
* gcc 4.9 on 64 bit architectures define the macros for data sizes 1, 2, 4, and 8 and support __sync_val_compare_and_swap accordingly
* all architectures that support any __sync_val_compare_and_swap (gcc 4.1+) so do for at least int, size_t and void*.
** Attachment added: "dirks-atomic-predef.txt"
https://bugs.launchpad.net/epics-base/+bug/1932118/+attachment/5506973/+files/dirks-atomic-predef.txt
--
You received this bug notification because you are a member of EPICS
Core Developers, which is subscribed to EPICS Base.
Matching subscriptions: epics-core-list-subscription
https://bugs.launchpad.net/bugs/1932118
Title:
Bug in vxWorks epicsAtomicCmpAndSwapIntT
Status in EPICS Base:
Fix Committed
Bug description:
The usage of epicsAtomicCmpAndSwapIntT() in callback.c suggests that
the function should return the previous value. But the VxWorks
implementation uses vxCas() which is documented as returning "TRUE if
the write actually occurs, FALSE otherwise."
vxAtomicLib.html:
vxCas( )
NAME
vxCas( ) - atomically compare-and-swap the contents of a memory location
SYNOPSIS
BOOL vxCas
(
atomic_t * target,
atomicVal_t oldValue,
atomicVal_t newValue
)
DESCRIPTION
This routine performs an atomic compare-and-swap; testing that *target contains oldValue, and if it does, setting the value of *target to newValue.
RETURNS
TRUE if the swap is actually executed, FALSE otherwise.
Comparing this with the gcc documentation:
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
These builtins perform an atomic compare and swap. That is, if the
current value of *ptr is oldval, then write newval into *ptr.
The “bool” version returns true if the comparison is successful and newval was written.
The “val” version returns the contents of *ptr before the operation.
That means epicsAtomicCmpAndSwapIntT() behaves behaves like __sync_bool_compare_and_swap(). Simply casting the return value from BOOL to the type of oldVal does not change that.
But the usage implies an expected bahavior like
__sync_val_compare_and_swap (), wich is used in the gcc implementation
of epicsAtomicCmpAndSwapIntT().
This bugs prevents the callback threads from being started in vxWorks 6.7, maybe more or all vxWorks 6 versions.
To manage notifications about this bug go to:
https://bugs.launchpad.net/epics-base/+bug/1932118/+subscriptions
- References:
- [Bug 1932118] [NEW] Bug in vxWorks epicsAtomicCmpAndSwapIntT Dirk Zimoch via Core-talk
- Navigate by Date:
- Prev:
Build failed: EPICS Base 7 base-7.0-348 AppVeyor via Core-talk
- Next:
Build failed: epics-base base-fix_socket_include-38 AppVeyor via Core-talk
- Index:
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
<2021>
2022
2023
2024
- Navigate by Thread:
- Prev:
[Bug 1932118] Re: Bug in vxWorks epicsAtomicCmpAndSwapIntT mdavidsaver via Core-talk
- Next:
[Bug 1932118] Re: Bug in vxWorks epicsAtomicCmpAndSwapIntT Andrew Johnson via Core-talk
- Index:
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
<2021>
2022
2023
2024
|