diff --git a/xflaim/src/flaimsys.h b/xflaim/src/flaimsys.h index fb8bb51..1be580a 100644 --- a/xflaim/src/flaimsys.h +++ b/xflaim/src/flaimsys.h @@ -568,7 +568,6 @@ private: FLMUNICODE ** m_ppuzNamespaces; FLMUINT m_uiNamespaceTblSize; FLMUINT m_uiNumNamespaces; - F_MUTEX m_hRefMutex; friend class F_Db; }; diff --git a/xflaim/src/flopen.cpp b/xflaim/src/flopen.cpp index 63eba44..1db2d21 100644 --- a/xflaim/src/flopen.cpp +++ b/xflaim/src/flopen.cpp @@ -1255,7 +1255,7 @@ F_Database::~F_Database() { FLMUINT uiRefCnt; - uiRefCnt = m_pFileIdList->Release( FALSE); + uiRefCnt = m_pFileIdList->Release(); flmAssert( !uiRefCnt); m_pFileIdList = NULL; } @@ -1270,7 +1270,7 @@ F_Database::~F_Database() if (m_pDatabaseLockObj) { - m_pDatabaseLockObj->Release( FALSE); + m_pDatabaseLockObj->Release(); m_pDatabaseLockObj = NULL; } diff --git a/xflaim/src/fntable.cpp b/xflaim/src/fntable.cpp index 4b01231..a3b0cae 100644 --- a/xflaim/src/fntable.cpp +++ b/xflaim/src/fntable.cpp @@ -168,7 +168,6 @@ F_NameTable::F_NameTable() m_ppuzNamespaces = NULL; m_uiNamespaceTblSize = 0; m_uiNumNamespaces = 0; - m_hRefMutex = F_MUTEX_NULL; } /**************************************************************************** @@ -177,11 +176,6 @@ Desc: Destructor F_NameTable::~F_NameTable() { clearTable( 0); - - if( m_hRefMutex) - { - f_mutexDestroy( &m_hRefMutex); - } } /**************************************************************************** @@ -190,20 +184,7 @@ Desc: Setup name table. This routine should be called immediately after ****************************************************************************/ RCODE F_NameTable::setupNameTable( void) { -#ifndef FLM_HAVE_ATOMICS - RCODE rc = NE_XFLM_OK; - - if( RC_BAD( rc = f_mutexCreate( &m_hRefMutex))) - { - goto Exit; - } - -Exit: - - return( rc); -#else return( NE_XFLM_OK); -#endif } /**************************************************************************** @@ -2412,7 +2393,7 @@ Desc: Increment use count on this object. ****************************************************************************/ FLMINT XFLMAPI F_NameTable::AddRef( void) { - return( flmAtomicInc( &m_refCnt, m_hRefMutex, FALSE)); + return( flmAtomicInc( &m_refCnt)); } /**************************************************************************** @@ -2422,7 +2403,7 @@ FLMINT XFLMAPI F_NameTable::Release( void) { FLMINT iRefCnt; - if ((iRefCnt = flmAtomicDec( &m_refCnt, m_hRefMutex, FALSE)) == 0) + if ((iRefCnt = flmAtomicDec( &m_refCnt)) == 0) { delete this; } diff --git a/xflaim/src/fposix.cpp b/xflaim/src/fposix.cpp index d7f0de7..9e6989d 100644 --- a/xflaim/src/fposix.cpp +++ b/xflaim/src/fposix.cpp @@ -59,6 +59,8 @@ #include #endif +pthread_mutex_t gv_atomicMutex = PTHREAD_MUTEX_INITIALIZER; + /****************************************************************************** Desc: *******************************************************************************/ @@ -1608,6 +1610,40 @@ static void sparc_asm_code( void) } #endif +/********************************************************************** +Desc: +**********************************************************************/ +extern "C" FLMINT32 posix_atomic_add_32( + volatile FLMINT32 * piTarget, + FLMINT32 iDelta) +{ + FLMINT32 iNewVal; + + pthread_mutex_lock( &gv_atomicMutex); + (*piTarget) += iDelta; + iNewVal = *piTarget; + pthread_mutex_unlock( &gv_atomicMutex); + + return( iNewVal); +} + +/********************************************************************** +Desc: +**********************************************************************/ +extern "C" FLMINT32 posix_atomic_xchg_32( + volatile FLMINT32 * piTarget, + FLMINT32 iNewValue) +{ + FLMINT32 iOldVal; + + pthread_mutex_lock( &gv_atomicMutex); + iOldVal = *piTarget; + *piTarget = iNewValue; + pthread_mutex_unlock( &gv_atomicMutex); + + return( iOldVal); +} + #endif // FLM_UNIX #if defined( FLM_WATCOM_NLM) diff --git a/xflaim/src/fsuperfl.cpp b/xflaim/src/fsuperfl.cpp index 98d6882..0f65c9a 100644 --- a/xflaim/src/fsuperfl.cpp +++ b/xflaim/src/fsuperfl.cpp @@ -172,7 +172,7 @@ F_SuperFileHdl::~F_SuperFileHdl() if( m_pFileIdList) { - m_pFileIdList->Release( FALSE); + m_pFileIdList->Release(); } if (m_pszDbFileName) @@ -215,7 +215,7 @@ RCODE F_SuperFileHdl::Setup( { FLMUINT uiRefCnt; - uiRefCnt = m_pFileIdList->Release( FALSE); + uiRefCnt = m_pFileIdList->Release(); flmAssert( !uiRefCnt); m_pFileIdList = NULL; goto Exit; @@ -223,7 +223,7 @@ RCODE F_SuperFileHdl::Setup( } else { - pFileIdList->AddRef( FALSE); + pFileIdList->AddRef(); m_pFileIdList = pFileIdList; } diff --git a/xflaim/src/fsuperfl.h b/xflaim/src/fsuperfl.h index 22b40db..2d8cae3 100644 --- a/xflaim/src/fsuperfl.h +++ b/xflaim/src/fsuperfl.h @@ -88,16 +88,14 @@ public: FLMUINT uiFileNumber, FLMUINT * puiFileId); - FINLINE FLMINT XFLMAPI AddRef( - FLMBOOL bMutexLocked) + FINLINE FLMINT XFLMAPI AddRef( void) { - return( flmAtomicInc( &m_refCnt, m_hMutex, bMutexLocked)); + return( flmAtomicInc( &m_refCnt)); } - FINLINE FLMINT XFLMAPI Release( - FLMBOOL bMutexLocked) + FINLINE FLMINT XFLMAPI Release( void) { - FLMINT iRefCnt = flmAtomicDec( &m_refCnt, m_hMutex, bMutexLocked); + FLMINT iRefCnt = flmAtomicDec( &m_refCnt); if( !iRefCnt) { @@ -109,16 +107,6 @@ public: private: - FINLINE FLMINT XFLMAPI AddRef( void) - { - return( AddRef( FALSE)); - } - - FINLINE FLMINT XFLMAPI Release( void) - { - return( Release( FALSE)); - } - F_MUTEX m_hMutex; FLMUINT m_uiFileIdTblSize; FLMUINT * m_puiFileIdTbl; diff --git a/xflaim/src/ftk.h b/xflaim/src/ftk.h index 453391c..c1554d5 100644 --- a/xflaim/src/ftk.h +++ b/xflaim/src/ftk.h @@ -1502,15 +1502,6 @@ return( uiSeconds + f_timeGetLocalOffset()); } - /********************************************************************** - Desc: Atomic Increment, Decrement, Exchange - Note: Some of this code is derived from the Ximian source code contained - in that Mono project's atomic.h file. - **********************************************************************/ - #ifndef FLM_HAVE_ATOMICS - #define FLM_HAVE_ATOMICS - #endif - /********************************************************************** Desc: **********************************************************************/ @@ -1544,7 +1535,25 @@ /********************************************************************** Desc: **********************************************************************/ - FINLINE FLMINT32 _flmAtomicInc( + #if defined( FLM_UNIX) + extern "C" FLMINT32 posix_atomic_add_32( + volatile FLMINT32 * piTarget, + FLMINT32 iDelta); + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + #if defined( FLM_UNIX) + extern "C" FLMINT32 posix_atomic_xchg_32( + volatile FLMINT32 * piTarget, + FLMINT32 iNewValue); + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + FINLINE FLMINT32 flmAtomicInc( FLMATOMIC * piTarget) { #if defined( FLM_NLM) @@ -1579,22 +1588,17 @@ return( i32Tmp + 1); } + #elif defined( FLM_UNIX) + return( posix_atomic_add_32( piTarget, 1)); #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - - flmAssert( 0); - return( 0); + #error Atomic operations aren't supported #endif } /********************************************************************** Desc: **********************************************************************/ - FINLINE FLMINT32 _flmAtomicDec( + FINLINE FLMINT32 flmAtomicDec( FLMATOMIC * piTarget) { #if defined( FLM_NLM) @@ -1629,22 +1633,17 @@ return( i32Tmp - 1); } + #elif defined( FLM_UNIX) + return( posix_atomic_add_32( piTarget, -1)); #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - - flmAssert( 0); - return( 0); + #error Atomic operations aren't supported #endif } /********************************************************************** Desc: **********************************************************************/ - FINLINE FLMINT32 _flmAtomicExchange( + FINLINE FLMINT32 flmAtomicExchange( FLMATOMIC * piTarget, FLMINT32 i32NewVal) { @@ -1708,135 +1707,13 @@ return( i32OldVal); } + #elif defined( FLM_UNIX) + return( posix_atomic_xchg_32( piTarget, i32NewVal)); #else - #ifdef FLM_HAVE_ATOMICS - #undef FLM_HAVE_ATOMICS - #endif - - F_UNREFERENCED_PARM( piTarget); - F_UNREFERENCED_PARM( i32NewVal); - - flmAssert( 0); - return( 0); + #error Atomic operations aren't supported #endif } - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 flmAtomicInc( - FLMATOMIC * piTarget, - F_MUTEX hMutex = F_MUTEX_NULL, - FLMBOOL bMutexAlreadyLocked = FALSE) - { - #ifdef FLM_HAVE_ATOMICS - { - F_UNREFERENCED_PARM( bMutexAlreadyLocked); - F_UNREFERENCED_PARM( hMutex); - - return( _flmAtomicInc( piTarget)); - } - #else - { - FLMINT32 i32NewVal; - - flmAssert( hMutex != F_MUTEX_NULL); - - if( !bMutexAlreadyLocked) - { - f_mutexLock( hMutex); - } - - i32NewVal = (FLMINT32)(++(*piTarget)); - - if( !bMutexAlreadyLocked) - { - f_mutexUnlock( hMutex); - } - - return( i32NewVal); - } - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 flmAtomicDec( - FLMATOMIC * piTarget, - F_MUTEX hMutex = F_MUTEX_NULL, - FLMBOOL bMutexAlreadyLocked = FALSE) - { - #ifdef FLM_HAVE_ATOMICS - { - F_UNREFERENCED_PARM( bMutexAlreadyLocked); - F_UNREFERENCED_PARM( hMutex); - - return( _flmAtomicDec( piTarget)); - } - #else - { - FLMINT32 i32NewVal; - - flmAssert( hMutex != F_MUTEX_NULL); - - if( !bMutexAlreadyLocked) - { - f_mutexLock( hMutex); - } - - i32NewVal = (FLMINT32)(--(*piTarget)); - - if( !bMutexAlreadyLocked) - { - f_mutexUnlock( hMutex); - } - - return( i32NewVal); - } - #endif - } - - /********************************************************************** - Desc: - **********************************************************************/ - FINLINE FLMINT32 flmAtomicExchange( - FLMATOMIC * piTarget, - FLMINT32 i32NewVal, - F_MUTEX hMutex = F_MUTEX_NULL, - FLMBOOL bMutexAlreadyLocked = FALSE) - { - #ifdef FLM_HAVE_ATOMICS - { - F_UNREFERENCED_PARM( bMutexAlreadyLocked); - F_UNREFERENCED_PARM( hMutex); - - return( _flmAtomicExchange( piTarget, i32NewVal)); - } - #else - { - FLMINT32 i32OldVal; - - flmAssert( hMutex != F_MUTEX_NULL); - - if( !bMutexAlreadyLocked) - { - f_mutexLock( hMutex); - } - - i32OldVal = (FLMINT32)*piTarget; - *piTarget = i32NewVal; - - if( !bMutexAlreadyLocked) - { - f_mutexUnlock( hMutex); - } - - return( i32OldVal); - } - #endif - } - /**************************************************************************** Desc: Mutex and semaphore routines ****************************************************************************/ diff --git a/xflaim/src/ftkthrd.cpp b/xflaim/src/ftkthrd.cpp index 4d93d81..468306c 100644 --- a/xflaim/src/ftkthrd.cpp +++ b/xflaim/src/ftkthrd.cpp @@ -43,19 +43,17 @@ /**************************************************************************** Desc: Add a Reference to this object. ****************************************************************************/ -FLMINT F_Thread::AddRef( - FLMBOOL bMutexLocked) +FLMINT F_Thread::AddRef( void) { - return( flmAtomicInc( &m_refCnt, m_hMutex, bMutexLocked)); + return( flmAtomicInc( &m_refCnt)); } /**************************************************************************** Desc: Removes a reference to this object. ****************************************************************************/ -FLMINT F_Thread::Release( - FLMBOOL bMutexLocked) +FLMINT F_Thread::Release( void) { - FLMINT iRefCnt = flmAtomicDec( &m_refCnt, m_hMutex, bMutexLocked); + FLMINT iRefCnt = flmAtomicDec( &m_refCnt); if( !iRefCnt) { @@ -786,7 +784,7 @@ RCODE F_ThreadMgr::findThread( { // Found a match. - pCurThread->AddRef( TRUE); + pCurThread->AddRef(); *ppThread = pCurThread; f_mutexUnlock( pCurThread->m_hMutex); goto Exit; diff --git a/xflaim/src/ftkthrd.h b/xflaim/src/ftkthrd.h index 87ba5a0..26189cb 100644 --- a/xflaim/src/ftkthrd.h +++ b/xflaim/src/ftkthrd.h @@ -218,25 +218,9 @@ public: cleanupThread(); } - // Reference counting methods. + FLMINT XFLMAPI AddRef( void); - FLMINT AddRef( - FLMBOOL bMutexLocked); - - FLMINT Release( - FLMBOOL bMutexLocked); - - // Override the AddRef and Release from XF_RefCount - - FINLINE FLMINT XFLMAPI AddRef( void) - { - return( AddRef( FALSE)); - } - - FINLINE FLMINT XFLMAPI Release( void) - { - return( Release( FALSE)); - } + FLMINT XFLMAPI Release( void); // Other methods