aboutsummaryrefslogtreecommitdiff
path: root/PxShared/src/foundation
diff options
context:
space:
mode:
authorSheikh Dawood Abdul Ajees <[email protected]>2018-02-12 15:31:42 -0600
committerSheikh Dawood Abdul Ajees <[email protected]>2018-02-12 15:31:42 -0600
commit52dae55c0c65f42caffa9d803be27be44ac4b8a3 (patch)
treec2fa77a97691d026593fe6aa45f1a56389fc5c70 /PxShared/src/foundation
parentPhysX 3.4, APEX 1.4 patch release @23472123 (diff)
downloadphysx-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.h42
-rw-r--r--PxShared/src/foundation/src/unix/PsUnixMutex.cpp12
-rw-r--r--PxShared/src/foundation/src/windows/PsWindowsMutex.cpp11
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()