epicsAtomic: fix C linkage

With gcc -std=gnu99 (present default) functions qualified
with plain 'inline' emit strong public symbols (nm says 'T')
in every compilation unit the definition appears.
This causes linking to fail in all cases where executable
are statically linked, and many where dynamic linking is used.
This commit is contained in:
Michael Davidsaver
2015-02-27 17:29:11 -05:00
parent 84e9ff3bc5
commit 0d4519eb54
13 changed files with 82 additions and 191 deletions

View File

@@ -16,16 +16,6 @@
#ifndef epicsAtomicCD_h
#define epicsAtomicCD_h
#if defined ( __cplusplus )
# define EPICS_ATOMIC_INLINE inline
#else
# define EPICS_ATOMIC_INLINE __inline__
#endif
/*
* we have an inline keyword so we can proceed
* with an os specific inline instantiation
*/
#include "epicsAtomicOSD.h"
#endif /* epicsAtomicCD_h */

View File

@@ -16,15 +16,6 @@
#ifndef epicsAtomicCD_h
#define epicsAtomicCD_h
#if __STDC_VERSION__ >= 199901L || defined ( __cplusplus )
# define EPICS_ATOMIC_INLINE inline
/*
* We have already defined the public interface in epicsAtomic.h
* so there is nothing more to implement if there isnt an inline
* keyword available. Otherwise, if we have an inline keyword
* we will proceed with an os specific inline implementation.
*/
# include "epicsAtomicOSD.h"
#endif
#include "epicsAtomicOSD.h"
#endif /* epicsAtomicCD_h */

View File

@@ -20,8 +20,6 @@
# error this header is only for use with the gnu compiler
#endif
#define EPICS_ATOMIC_INLINE __inline__
#define GCC_ATOMIC_CONCAT( A, B ) GCC_ATOMIC_CONCATR(A,B)
#define GCC_ATOMIC_CONCATR( A, B ) ( A ## B )
@@ -69,7 +67,7 @@ extern "C" {
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
#define EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void)
{
__sync_synchronize ();
}
@@ -77,7 +75,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
#ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
#define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void)
{
__sync_synchronize ();
}
@@ -88,7 +86,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
#if GCC_ATOMIC_INTRINSICS_MIN_X86
#define EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void)
{
asm("mfence;");
}
@@ -98,7 +96,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
#ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
#if GCC_ATOMIC_INTRINSICS_MIN_X86
#define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void)
{
asm("mfence;");
}

View File

@@ -26,16 +26,10 @@
#include <intrin.h>
#if _MSC_VER >= 1200
# define EPICS_ATOMIC_INLINE __forceinline
#else
# define EPICS_ATOMIC_INLINE __inline
#endif
#if defined ( _M_IX86 )
# pragma warning( push )
# pragma warning( disable : 4793 )
EPICS_ATOMIC_INLINE void epicsAtomicMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicMemoryBarrier (void)
{
long fence;
__asm { xchg fence, eax }
@@ -44,14 +38,14 @@
#elif defined ( _M_X64 )
# define MS_ATOMIC_64
# pragma intrinsic ( __faststorefence )
EPICS_ATOMIC_INLINE void epicsAtomicMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicMemoryBarrier (void)
{
__faststorefence ();
}
#elif defined ( _M_IA64 )
# define MS_ATOMIC_64
# pragma intrinsic ( __mf )
EPICS_ATOMIC_INLINE void epicsAtomicMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicMemoryBarrier (void)
{
__mf ();
}
@@ -88,13 +82,13 @@ extern "C" {
#endif /* __cplusplus */
#define EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void)
{
epicsAtomicMemoryBarrier ();
}
#define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void)
{
epicsAtomicMemoryBarrier ();
}
@@ -108,10 +102,6 @@ EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
#else /* ifdef _MSC_EXTENSIONS */
#if defined ( __cplusplus )
# define EPICS_ATOMIC_INLINE inline
#endif
/*
* if unavailable as an intrinsic we will try
* for os specific inline solution

View File

@@ -16,16 +16,6 @@
#ifndef epicsAtomicCD_h
#define epicsAtomicCD_h
#if defined ( __cplusplus )
# define EPICS_ATOMIC_INLINE inline
#else
# define EPICS_ATOMIC_INLINE __inline
#endif
/*
* we have an inline keyword so we can proceed
* with an os specific inline instantiation
*/
#include "epicsAtomicOSD.h"
#endif /* epicsAtomicCD_h */

View File

@@ -17,7 +17,9 @@
#include <stdlib.h> /* define size_t */
#include "shareLib.h"
#include "compilerSpecific.h"
#define EPICS_ATOMIC_INLINE EPICS_FUNC_INLINE
#ifdef __cplusplus
extern "C" {
@@ -26,10 +28,10 @@ extern "C" {
typedef void * EpicsAtomicPtrT;
/* load target into cache */
epicsShareFunc void epicsAtomicReadMemoryBarrier ();
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void);
/* push cache version of target into target */
epicsShareFunc void epicsAtomicWriteMemoryBarrier ();
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void);
/*
* lock out other smp processors from accessing the target,
@@ -37,8 +39,8 @@ epicsShareFunc void epicsAtomicWriteMemoryBarrier ();
* to target, allow other smp processors to access the target,
* return new value of target as modified by this operation
*/
epicsShareFunc size_t epicsAtomicIncrSizeT ( size_t * pTarget );
epicsShareFunc int epicsAtomicIncrIntT ( int * pTarget );
EPICS_ATOMIC_INLINE size_t epicsAtomicIncrSizeT ( size_t * pTarget );
EPICS_ATOMIC_INLINE int epicsAtomicIncrIntT ( int * pTarget );
/*
* lock out other smp processors from accessing the target,
@@ -46,8 +48,8 @@ epicsShareFunc int epicsAtomicIncrIntT ( int * pTarget );
* to target, allow out other smp processors to access the target,
* return new value of target as modified by this operation
*/
epicsShareFunc size_t epicsAtomicDecrSizeT ( size_t * pTarget );
epicsShareFunc int epicsAtomicDecrIntT ( int * pTarget );
EPICS_ATOMIC_INLINE size_t epicsAtomicDecrSizeT ( size_t * pTarget );
EPICS_ATOMIC_INLINE int epicsAtomicDecrIntT ( int * pTarget );
/*
* lock out other smp processors from accessing the target,
@@ -55,23 +57,23 @@ epicsShareFunc int epicsAtomicDecrIntT ( int * pTarget );
* to target, allow other smp processors to access the target,
* return new value of target as modified by this operation
*/
epicsShareFunc size_t epicsAtomicAddSizeT ( size_t * pTarget, size_t delta );
epicsShareFunc size_t epicsAtomicSubSizeT ( size_t * pTarget, size_t delta );
epicsShareFunc int epicsAtomicAddIntT ( int * pTarget, int delta );
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT ( size_t * pTarget, size_t delta );
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT ( size_t * pTarget, size_t delta );
EPICS_ATOMIC_INLINE int epicsAtomicAddIntT ( int * pTarget, int delta );
/*
* set cache version of target, flush cache to target
*/
epicsShareFunc void epicsAtomicSetSizeT ( size_t * pTarget, size_t newValue );
epicsShareFunc void epicsAtomicSetIntT ( int * pTarget, int newValue );
epicsShareFunc void epicsAtomicSetPtrT ( EpicsAtomicPtrT * pTarget, EpicsAtomicPtrT newValue );
EPICS_ATOMIC_INLINE void epicsAtomicSetSizeT ( size_t * pTarget, size_t newValue );
EPICS_ATOMIC_INLINE void epicsAtomicSetIntT ( int * pTarget, int newValue );
EPICS_ATOMIC_INLINE void epicsAtomicSetPtrT ( EpicsAtomicPtrT * pTarget, EpicsAtomicPtrT newValue );
/*
* fetch target into cache, return new value of target
*/
epicsShareFunc size_t epicsAtomicGetSizeT ( const size_t * pTarget );
epicsShareFunc int epicsAtomicGetIntT ( const int * pTarget );
epicsShareFunc EpicsAtomicPtrT epicsAtomicGetPtrT ( const EpicsAtomicPtrT * pTarget );
EPICS_ATOMIC_INLINE size_t epicsAtomicGetSizeT ( const size_t * pTarget );
EPICS_ATOMIC_INLINE int epicsAtomicGetIntT ( const int * pTarget );
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicGetPtrT ( const EpicsAtomicPtrT * pTarget );
/*
* lock out other smp processors from accessing the target,
@@ -80,11 +82,11 @@ epicsShareFunc EpicsAtomicPtrT epicsAtomicGetPtrT ( const EpicsAtomicPtrT * pTar
* to access the target, return the original value stored in the
* target
*/
epicsShareFunc size_t epicsAtomicCmpAndSwapSizeT ( size_t * pTarget,
EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT ( size_t * pTarget,
size_t oldVal, size_t newVal );
epicsShareFunc int epicsAtomicCmpAndSwapIntT ( int * pTarget,
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT ( int * pTarget,
int oldVal, int newVal );
epicsShareFunc EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
EpicsAtomicPtrT * pTarget,
EpicsAtomicPtrT oldVal,
EpicsAtomicPtrT newVal );
@@ -111,119 +113,98 @@ namespace atomic {
/*
* overloaded c++ interface
*/
epicsShareFunc size_t increment ( size_t & v );
epicsShareFunc int increment ( int & v );
epicsShareFunc size_t decrement ( size_t & v );
epicsShareFunc int decrement ( int & v );
epicsShareFunc size_t add ( size_t & v, size_t delta );
epicsShareFunc int add ( int & v, int delta );
epicsShareFunc size_t subtract ( size_t & v, size_t delta );
epicsShareFunc int subtract ( int & v, int delta );
epicsShareFunc void set ( size_t & v , size_t newValue );
epicsShareFunc void set ( int & v, int newValue );
epicsShareFunc void set ( EpicsAtomicPtrT & v,
EpicsAtomicPtrT newValue );
epicsShareFunc size_t get ( const size_t & v );
epicsShareFunc int get ( const int & v );
epicsShareFunc EpicsAtomicPtrT get ( const EpicsAtomicPtrT & v );
epicsShareFunc size_t compareAndSwap ( size_t & v, size_t oldVal,
size_t newVal );
epicsShareFunc int compareAndSwap ( int & v, int oldVal, int newVal );
epicsShareFunc EpicsAtomicPtrT compareAndSwap ( EpicsAtomicPtrT & v,
EpicsAtomicPtrT oldVal,
EpicsAtomicPtrT newVal );
/************* incr ***************/
inline size_t increment ( size_t & v )
EPICS_ATOMIC_INLINE size_t increment ( size_t & v )
{
return epicsAtomicIncrSizeT ( & v );
}
inline int increment ( int & v )
EPICS_ATOMIC_INLINE int increment ( int & v )
{
return epicsAtomicIncrIntT ( & v );
}
/************* decr ***************/
inline size_t decrement ( size_t & v )
EPICS_ATOMIC_INLINE size_t decrement ( size_t & v )
{
return epicsAtomicDecrSizeT ( & v );
}
inline int decrement ( int & v )
EPICS_ATOMIC_INLINE int decrement ( int & v )
{
return epicsAtomicDecrIntT ( & v );
}
/************* add ***************/
inline size_t add ( size_t & v, size_t delta )
EPICS_ATOMIC_INLINE size_t add ( size_t & v, size_t delta )
{
return epicsAtomicAddSizeT ( & v, delta );
}
inline int add ( int & v, int delta )
EPICS_ATOMIC_INLINE int add ( int & v, int delta )
{
return epicsAtomicAddIntT ( & v, delta );
}
/************* sub ***************/
inline size_t subtract ( size_t & v, size_t delta )
EPICS_ATOMIC_INLINE size_t subtract ( size_t & v, size_t delta )
{
return epicsAtomicSubSizeT ( & v, delta );
}
inline int subtract ( int & v, int delta )
EPICS_ATOMIC_INLINE int subtract ( int & v, int delta )
{
return epicsAtomicAddIntT ( & v, -delta );
}
/************* set ***************/
inline void set ( size_t & v , size_t newValue )
EPICS_ATOMIC_INLINE void set ( size_t & v , size_t newValue )
{
epicsAtomicSetSizeT ( & v, newValue );
}
inline void set ( int & v, int newValue )
EPICS_ATOMIC_INLINE void set ( int & v, int newValue )
{
epicsAtomicSetIntT ( & v, newValue );
}
inline void set ( EpicsAtomicPtrT & v, EpicsAtomicPtrT newValue )
EPICS_ATOMIC_INLINE void set ( EpicsAtomicPtrT & v, EpicsAtomicPtrT newValue )
{
epicsAtomicSetPtrT ( & v, newValue );
}
/************* get ***************/
inline size_t get ( const size_t & v )
EPICS_ATOMIC_INLINE size_t get ( const size_t & v )
{
return epicsAtomicGetSizeT ( & v );
}
inline int get ( const int & v )
EPICS_ATOMIC_INLINE int get ( const int & v )
{
return epicsAtomicGetIntT ( & v );
}
inline EpicsAtomicPtrT get ( const EpicsAtomicPtrT & v )
EPICS_ATOMIC_INLINE EpicsAtomicPtrT get ( const EpicsAtomicPtrT & v )
{
return epicsAtomicGetPtrT ( & v );
}
/************* cas ***************/
inline size_t compareAndSwap ( size_t & v,
size_t oldVal, size_t newVal )
EPICS_ATOMIC_INLINE size_t compareAndSwap ( size_t & v,
size_t oldVal, size_t newVal )
{
return epicsAtomicCmpAndSwapSizeT ( & v, oldVal, newVal );
}
inline int compareAndSwap ( int & v, int oldVal, int newVal )
EPICS_ATOMIC_INLINE int compareAndSwap ( int & v, int oldVal, int newVal )
{
return epicsAtomicCmpAndSwapIntT ( & v, oldVal, newVal );
}
inline EpicsAtomicPtrT compareAndSwap ( EpicsAtomicPtrT & v,
EpicsAtomicPtrT oldVal,
EpicsAtomicPtrT newVal )
EPICS_ATOMIC_INLINE EpicsAtomicPtrT compareAndSwap ( EpicsAtomicPtrT & v,
EpicsAtomicPtrT oldVal,
EpicsAtomicPtrT newVal )
{
return epicsAtomicCmpAndSwapPtrT ( & v, oldVal, newVal );
}

View File

@@ -1,22 +0,0 @@
/*************************************************************************\
* Copyright (c) 2011 LANS LLC, as Operator of
* Los Alamos National Laboratory.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#define epicsExportSharedSymbols
#include "epicsAtomic.h"
// if the compiler is unable to inline then instantiate out-of-line
#ifndef EPICS_ATOMIC_INLINE
# define EPICS_ATOMIC_INLINE
# include "epicsAtomicOSD.h"
#endif

View File

@@ -19,14 +19,6 @@
#include "epicsAssert.h"
#include "epicsAtomic.h"
// if the compiler is unable to inline then instantiate out-of-line
#ifndef EPICS_ATOMIC_INLINE
# define EPICS_ATOMIC_INLINE
# include "epicsAtomicOSD.h"
#endif
#ifndef EPICS_ATOMIC_LOCK
/*
* Slow, but probably correct on all systems.
* Useful only if something more efficient isn`t
@@ -69,31 +61,14 @@ void epicsAtomicUnlock ( EpicsAtomicLockKey * )
assert ( status == 0 );
}
#endif // ifndef EPICS_ATOMIC_LOCK
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
// Slow, but probably correct on all systems.
// Useful only if something more efficient isn`t
// provided based on knowledge of the compiler
// or OS
void epicsAtomicReadMemoryBarrier ()
void epicsAtomicMemoryBarrierFallback (void)
{
EpicsAtomicLockKey key;
epicsAtomicLock ( & key );
epicsAtomicUnlock ( & key );
}
#endif
#ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
// Slow, but probably correct on all systems.
// Useful only if something more efficient isn`t
// provided based on knowledge of the compiler
// or OS
void epicsAtomicWriteMemoryBarrier ()
{
EpicsAtomicLockKey key;
epicsAtomicLock ( & key );
epicsAtomicUnlock ( & key );
}
#endif

View File

@@ -16,14 +16,31 @@
#ifndef epicsAtomicOSD_h
#define epicsAtomicOSD_h
#include <shareLib.h>
typedef struct EpicsAtomicLockKey {} EpicsAtomicLockKey;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void)
{
epicsAtomicMemoryBarrierFallback();
}
#endif
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void)
{
epicsAtomicMemoryBarrierFallback();
}
#endif
epicsShareFunc void epicsAtomicLock ( struct EpicsAtomicLockKey * );
epicsShareFunc void epicsAtomicUnlock ( struct EpicsAtomicLockKey * );
epicsShareFunc void epicsAtomicMemoryBarrierFallback ( void );
#ifdef __cplusplus
} /* end of extern "C" */

View File

@@ -13,6 +13,8 @@
* johill@lanl.gov
*/
#include "shareLib.h"
#ifndef epicsAtomicOSD_h
#define epicsAtomicOSD_h
@@ -31,7 +33,7 @@ extern "C" {
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
#define EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void)
{
membar_consumer ();
}
@@ -39,7 +41,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
#ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
#define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void)
{
membar_producer ();
}
@@ -47,7 +49,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
#ifndef EPICS_ATOMIC_CAS_INTT
#define EPICS_ATOMIC_CAS_INTT
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT ( int * pTarget,
EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT ( int * pTarget,
int oldVal, int newVal )
{
STATIC_ASSERT ( sizeof ( int ) == sizeof ( unsigned ) );
@@ -59,7 +61,7 @@ EPICS_ATOMIC_INLINE int epicsAtomicCmpAndSwapIntT ( int * pTarget,
#ifndef EPICS_ATOMIC_CAS_SIZET
#define EPICS_ATOMIC_CAS_SIZET
EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT (
EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT (
size_t * pTarget,
size_t oldVal, size_t newVal )
{
@@ -71,7 +73,7 @@ EPICS_ATOMIC_INLINE size_t epicsAtomicCmpAndSwapSizeT (
#ifndef EPICS_ATOMIC_CAS_PTRT
#define EPICS_ATOMIC_CAS_PTRT
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
EPICS_ATOMIC_INLINE EpicsAtomicPtrT epicsAtomicCmpAndSwapPtrT (
EpicsAtomicPtrT * pTarget,
EpicsAtomicPtrT oldVal,
EpicsAtomicPtrT newVal )
@@ -132,7 +134,7 @@ EPICS_ATOMIC_INLINE int epicsAtomicAddIntT ( int * pTarget, int delta )
#ifndef EPICS_ATOMIC_ADD_SIZET
#define EPICS_ATOMIC_ADD_SIZET
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT ( size_t * pTarget,
EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT ( size_t * pTarget,
size_t delta )
{
STATIC_ASSERT ( sizeof ( ulong_t ) == sizeof ( size_t ) );
@@ -143,7 +145,7 @@ EPICS_ATOMIC_INLINE size_t epicsAtomicAddSizeT ( size_t * pTarget,
#ifndef EPICS_ATOMIC_SUB_SIZET
#define EPICS_ATOMIC_SUB_SIZET
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT ( size_t * pTarget,
EPICS_ATOMIC_INLINE size_t epicsAtomicSubSizeT ( size_t * pTarget,
size_t delta )
{
STATIC_ASSERT ( sizeof ( ulong_t ) == sizeof ( size_t ) );

View File

@@ -1,21 +0,0 @@
/*************************************************************************\
* Copyright (c) 2011 LANS LLC, as Operator of
* Los Alamos National Laboratory.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#define epicsExportSharedSymbols
#include "epicsAtomic.h"
// if the compiler is unable to inline then instantiate out-of-line
#ifndef EPICS_ATOMIC_INLINE
# define EPICS_ATOMIC_INLINE
# include "epicsAtomicOSD.h"
#endif

View File

@@ -38,7 +38,7 @@ extern "C" {
#ifndef EPICS_ATOMIC_READ_MEMORY_BARRIER
#define EPICS_ATOMIC_READ_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void)
{
VX_MEM_BARRIER_R ();
}
@@ -46,7 +46,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier ()
#ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
#define EPICS_ATOMIC_WRITE_MEMORY_BARRIER
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier ()
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void)
{
VX_MEM_BARRIER_W ();
}
@@ -232,7 +232,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicUnlock ( EpicsAtomicLockKey * pKey )
* no need for memory barrior since prior to vxWorks 6.6 it is a single cpu system
* (we are not protecting against multiple access to memory mapped IO)
*/
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier () {}
EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier (void) {}
#endif
#ifndef EPICS_ATOMIC_WRITE_MEMORY_BARRIER
@@ -241,7 +241,7 @@ EPICS_ATOMIC_INLINE void epicsAtomicReadMemoryBarrier () {}
* no need for memory barrior since prior to vxWorks 6.6 it is a single cpu system
* (we are not protecting against multiple access to memory mapped IO)
*/
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier () {}
EPICS_ATOMIC_INLINE void epicsAtomicWriteMemoryBarrier (void) {}
#endif
#ifdef __cplusplus