From eeae0db616867149898657fe9689f25dfee14a84 Mon Sep 17 00:00:00 2001 From: ahodgkinson Date: Tue, 9 May 2006 17:57:40 +0000 Subject: [PATCH] Added implementations for "posix" atomic operations. git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@397 0109f412-320b-0410-ab79-c3e0c5ffbbe6 --- ftk/src/ftksys.h | 4 ++-- ftk/src/ftkunix.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) 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)