diff --git a/ftk/src/ftksys.h b/ftk/src/ftksys.h index 6c8b546..176a884 100644 --- a/ftk/src/ftksys.h +++ b/ftk/src/ftksys.h @@ -293,7 +293,7 @@ Desc: **********************************************************************/ #if defined( FLM_UNIX) - extern "C" FLMINT32 posix_atomic_add_32( + FLMINT32 posix_atomic_add_32( volatile FLMINT32 * piTarget, FLMINT32 iDelta); #endif @@ -302,7 +302,7 @@ Desc: **********************************************************************/ #if defined( FLM_UNIX) - extern "C" FLMINT32 posix_atomic_xchg_32( + FLMINT32 posix_atomic_xchg_32( volatile FLMINT32 * piTarget, FLMINT32 iNewValue); #endif diff --git a/ftk/src/ftkunix.cpp b/ftk/src/ftkunix.cpp index e789b67..92ff89b 100644 --- a/ftk/src/ftkunix.cpp +++ b/ftk/src/ftkunix.cpp @@ -69,6 +69,8 @@ static FLMUINT gv_uiLinuxRevision = 0; #endif +static pthread_mutex_t gv_atomicMutex = PTHREAD_MUTEX_INITIALIZER; + /****************************************************************************** Desc: *******************************************************************************/ @@ -1543,6 +1545,40 @@ void FLMAPI f_yieldCPU( void) { } +/********************************************************************** +Desc: +**********************************************************************/ +FLMINT32 posix_atomic_add_32( + volatile FLMINT32 * piTarget, + FLMINT32 iDelta) +{ + FLMINT32 i32RetVal; + + pthread_mutex_lock( gv_atomicMutex); + (*piTarget) += iDelta; + i32RetVal = *piTarget; + pthread_mutex_unlock( gv_atomicMutex); + + return( i32RetVal); +} + +/********************************************************************** +Desc: +**********************************************************************/ +FLMINT32 posix_atomic_xchg_32( + volatile FLMINT32 * piTarget, + FLMINT32 iNewValue) +{ + FLMINT32 i32RetVal; + + pthread_mutex_lock( gv_atomicMutex); + i32RetVal = *piTarget; + *piTarget = iNewValue; + pthread_mutex_unlock( gv_atomicMutex); + + return( i32RetVal); +} + #endif // FLM_UNIX #if defined( FLM_WATCOM_NLM)