Allow thin mutex calls to be inlined

refs #7622
This commit is contained in:
Gunnar Beutner 2014-11-12 06:48:23 +01:00
parent 02a7d97b17
commit 83a2e4c350
2 changed files with 41 additions and 19 deletions

View File

@ -52,6 +52,39 @@ static void InitThinMutex(void)
INITIALIZE_ONCE(&InitThinMutex);
#endif /* _DEBUG */
void ThinMutex::LockSlowPath(void)
{
LockSlowPath(false);
}
void ThinMutex::LockSlowPath(bool make_native)
{
unsigned int it = 0;
#ifdef _WIN32
# ifdef _WIN64
while (InterlockedCompareExchange64(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
# else /* _WIN64 */
while (InterlockedCompareExchange(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
# endif /* _WIN64 */
#else /* _WIN32 */
while (!__sync_bool_compare_and_swap(&m_Data, THINLOCK_UNLOCKED, THINLOCK_LOCKED)) {
#endif /* _WIN32 */
if (m_Data > THINLOCK_LOCKED) {
LockNative();
return;
}
make_native = true;
Spin(it);
it++;
}
if (make_native)
MakeNative();
}
void ThinMutex::MakeNative(void)
{
boost::mutex *mtx = new boost::mutex();

View File

@ -69,33 +69,22 @@ public:
inline void Lock(bool make_native = false)
{
bool contended = false;
unsigned int it = 0;
#ifdef _WIN32
# ifdef _WIN64
while (InterlockedCompareExchange64(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
if (InterlockedCompareExchange64(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
# else /* _WIN64 */
while (InterlockedCompareExchange(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
if (InterlockedCompareExchange(&m_Data, THINLOCK_LOCKED, THINLOCK_UNLOCKED) != THINLOCK_UNLOCKED) {
# endif /* _WIN64 */
#else /* _WIN32 */
while (!__sync_bool_compare_and_swap(&m_Data, THINLOCK_UNLOCKED, THINLOCK_LOCKED)) {
if (!__sync_bool_compare_and_swap(&m_Data, THINLOCK_UNLOCKED, THINLOCK_LOCKED)) {
#endif /* _WIN32 */
if (m_Data > THINLOCK_LOCKED) {
LockNative();
return;
}
contended = true;
Spin(it);
it++;
LockSlowPath();
}
if (contended || make_native)
MakeNative();
}
void LockSlowPath(void);
void LockSlowPath(bool make_native);
inline void Unlock(void)
{
#ifdef _WIN32
@ -112,7 +101,7 @@ public:
inline void Inflate(void)
{
Lock(true);
LockSlowPath(true);
Unlock();
}