diff --git a/Engine/source/platform/platformIntrinsics.gcc.h b/Engine/source/platform/platformIntrinsics.gcc.h index 4b092d067..17b6ad7dd 100644 --- a/Engine/source/platform/platformIntrinsics.gcc.h +++ b/Engine/source/platform/platformIntrinsics.gcc.h @@ -42,7 +42,8 @@ inline void dFetchAndAdd( volatile U32& ref, U32 val ) #if defined(TORQUE_OS_PS3) cellAtomicAdd32( (std::uint32_t *)&ref, val ); #elif !defined(TORQUE_OS_MAC) - __sync_fetch_and_add( ( volatile long* ) &ref, val ); + //__sync_fetch_and_add( ( volatile long* ) &ref, val ); + __sync_fetch_and_add(&ref, val ); #else OSAtomicAdd32( val, (int32_t* ) &ref); #endif @@ -53,7 +54,8 @@ inline void dFetchAndAdd( volatile S32& ref, S32 val ) #if defined(TORQUE_OS_PS3) cellAtomicAdd32( (std::uint32_t *)&ref, val ); #elif !defined(TORQUE_OS_MAC) - __sync_fetch_and_add( ( volatile long* ) &ref, val ); + //__sync_fetch_and_add( ( volatile long* ) &ref, val ); + __sync_fetch_and_add( &ref, val ); #else OSAtomicAdd32( val, (int32_t* ) &ref); #endif diff --git a/Engine/source/platform/threads/threadPool.cpp b/Engine/source/platform/threads/threadPool.cpp index 2ef2bb69b..f4f5cfef1 100644 --- a/Engine/source/platform/threads/threadPool.cpp +++ b/Engine/source/platform/threads/threadPool.cpp @@ -418,8 +418,11 @@ void ThreadPool::queueWorkItem( WorkItem* item ) // thread's run function. This may lead us to release // the semaphore more often than necessary, but it avoids // a race condition. - - if( !dCompareAndSwap( mNumThreadsReady, mNumThreads, mNumThreads ) ) + + //Wasn't there still a race condition? Why not rely entirely on the semaphore? + //For example, mNumThreadsReady initializes equalto mNumThreads, which could cause + //initial work items to hang. + //if( !dCompareAndSwap( mNumThreadsReady, mNumThreads, mNumThreads ) ) mSemaphore.release(); } }