diff options
| author | Sheikh Dawood Abdul Ajees <[email protected]> | 2018-02-12 15:31:42 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <[email protected]> | 2018-02-12 15:31:42 -0600 |
| commit | 52dae55c0c65f42caffa9d803be27be44ac4b8a3 (patch) | |
| tree | c2fa77a97691d026593fe6aa45f1a56389fc5c70 /PxShared/src/foundation | |
| parent | PhysX 3.4, APEX 1.4 patch release @23472123 (diff) | |
| download | physx-3.4-52dae55c0c65f42caffa9d803be27be44ac4b8a3.tar.xz physx-3.4-52dae55c0c65f42caffa9d803be27be44ac4b8a3.zip | |
PhysX 3.4, APEX 1.4 patch release @23576764
Diffstat (limited to 'PxShared/src/foundation')
| -rw-r--r-- | PxShared/src/foundation/include/PsMutex.h | 42 | ||||
| -rw-r--r-- | PxShared/src/foundation/src/unix/PsUnixMutex.cpp | 12 | ||||
| -rw-r--r-- | PxShared/src/foundation/src/windows/PsWindowsMutex.cpp | 11 |
3 files changed, 41 insertions, 24 deletions
diff --git a/PxShared/src/foundation/include/PsMutex.h b/PxShared/src/foundation/include/PsMutex.h index 23033d09..d870fa03 100644 --- a/PxShared/src/foundation/include/PsMutex.h +++ b/PxShared/src/foundation/include/PsMutex.h @@ -163,7 +163,8 @@ class PX_FOUNDATION_API ReadWriteLock ReadWriteLock(); ~ReadWriteLock(); - void lockReader(); + // "takeLock" can only be false if the thread already holds the mutex, e.g. if it already acquired the write lock + void lockReader(bool takeLock=true); void lockWriter(); void unlockReader(); @@ -173,10 +174,17 @@ class PX_FOUNDATION_API ReadWriteLock class ReadWriteLockImpl* mImpl; }; +typedef MutexT<> Mutex; + + + + +// PT: the following classes aren't used in PhysX but might still be used in APEX. + class ScopedReadLock { PX_NOCOPY(ScopedReadLock) - public: +public: PX_INLINE ScopedReadLock(ReadWriteLock& lock) : mLock(lock) { mLock.lockReader(); @@ -186,14 +194,14 @@ class ScopedReadLock mLock.unlockReader(); } - private: +private: ReadWriteLock& mLock; }; class ScopedWriteLock { PX_NOCOPY(ScopedWriteLock) - public: +public: PX_INLINE ScopedWriteLock(ReadWriteLock& lock) : mLock(lock) { mLock.lockWriter(); @@ -203,22 +211,20 @@ class ScopedWriteLock mLock.unlockWriter(); } - private: +private: ReadWriteLock& mLock; }; -typedef MutexT<> Mutex; - /* - * Use this type of lock for mutex behaviour that must operate on SPU and PPU - * On non-PS3 platforms, it is implemented using Mutex - */ +* Use this type of lock for mutex behaviour that must operate on SPU and PPU +* On non-PS3 platforms, it is implemented using Mutex +*/ class AtomicLock { Mutex mMutex; PX_NOCOPY(AtomicLock) - public: +public: AtomicLock() { } @@ -245,7 +251,7 @@ class AtomicLockCopy { AtomicLock* pLock; - public: +public: AtomicLockCopy() : pLock(NULL) { } @@ -277,7 +283,7 @@ class AtomicRwLock ReadWriteLock m_Lock; PX_NOCOPY(AtomicRwLock) - public: +public: AtomicRwLock() { } @@ -320,10 +326,18 @@ class ScopedAtomicLock } PX_NOCOPY(ScopedAtomicLock) - private: +private: AtomicLock& mLock; }; + + + + + + + + } // namespace shdfnd } // namespace physx diff --git a/PxShared/src/foundation/src/unix/PsUnixMutex.cpp b/PxShared/src/foundation/src/unix/PsUnixMutex.cpp index 23b65496..5ade5914 100644 --- a/PxShared/src/foundation/src/unix/PsUnixMutex.cpp +++ b/PxShared/src/foundation/src/unix/PsUnixMutex.cpp @@ -139,21 +139,23 @@ ReadWriteLock::~ReadWriteLock() PX_FREE(mImpl); } -void ReadWriteLock::lockReader() +void ReadWriteLock::lockReader(bool takeLock) { - mImpl->mutex.lock(); + if(takeLock) + mImpl->mutex.lock(); atomicIncrement(&mImpl->readerCounter); - mImpl->mutex.unlock(); + if(takeLock) + mImpl->mutex.unlock(); } void ReadWriteLock::lockWriter() { mImpl->mutex.lock(); - while(mImpl->readerCounter != 0) - ; + // spin lock until no readers + while (mImpl->readerCounter); } void ReadWriteLock::unlockReader() diff --git a/PxShared/src/foundation/src/windows/PsWindowsMutex.cpp b/PxShared/src/foundation/src/windows/PsWindowsMutex.cpp index e62de47c..2b3ba00a 100644 --- a/PxShared/src/foundation/src/windows/PsWindowsMutex.cpp +++ b/PxShared/src/foundation/src/windows/PsWindowsMutex.cpp @@ -129,13 +129,15 @@ ReadWriteLock::~ReadWriteLock() PX_FREE(mImpl); } -void ReadWriteLock::lockReader() +void ReadWriteLock::lockReader(bool takeLock) { - mImpl->mutex.lock(); + if(takeLock) + mImpl->mutex.lock(); InterlockedIncrement(&mImpl->readerCount); - mImpl->mutex.unlock(); + if(takeLock) + mImpl->mutex.unlock(); } void ReadWriteLock::lockWriter() @@ -143,8 +145,7 @@ void ReadWriteLock::lockWriter() mImpl->mutex.lock(); // spin lock until no readers - while(mImpl->readerCount) - ; + while(mImpl->readerCount); } void ReadWriteLock::unlockReader() |