Bug 1364624 - Switch from CRITICALSECTION to SRWLOCK. r=froydnj

--HG--
extra : rebase_source : 4acc959bb8ccc33f6d549b71bbd83b8f8d09b353
This commit is contained in:
Eric Rahm 2018-04-23 10:45:20 -07:00
parent 4b77101e8d
commit b626618f7d
3 changed files with 8 additions and 23 deletions

View File

@ -54,8 +54,8 @@ mozilla::detail::ConditionVariableImpl::notify_all()
void
mozilla::detail::ConditionVariableImpl::wait(MutexImpl& lock)
{
CRITICAL_SECTION* cs = &lock.platformData()->criticalSection;
bool r = SleepConditionVariableCS(&platformData()->cv_, cs, INFINITE);
SRWLOCK* srwlock = &lock.platformData()->lock;
bool r = SleepConditionVariableSRW(&platformData()->cv_, srwlock, INFINITE, 0);
MOZ_RELEASE_ASSERT(r);
}
@ -68,7 +68,7 @@ mozilla::detail::ConditionVariableImpl::wait_for(MutexImpl& lock,
return CVStatus::NoTimeout;
}
CRITICAL_SECTION* cs = &lock.platformData()->criticalSection;
SRWLOCK* srwlock = &lock.platformData()->lock;
// Note that DWORD is unsigned, so we have to be careful to clamp at 0. If
// rel_time is Forever, then ToMilliseconds is +inf, which evaluates as
@ -89,7 +89,7 @@ mozilla::detail::ConditionVariableImpl::wait_for(MutexImpl& lock,
}
}
BOOL r = SleepConditionVariableCS(&platformData()->cv_, cs, msec);
BOOL r = SleepConditionVariableSRW(&platformData()->cv_, srwlock, msec, 0);
if (r)
return CVStatus::NoTimeout;
MOZ_RELEASE_ASSERT(GetLastError() == ERROR_TIMEOUT);

View File

@ -13,7 +13,7 @@
struct mozilla::detail::MutexImpl::PlatformData
{
CRITICAL_SECTION criticalSection;
SRWLOCK lock;
};
#endif // MutexPlatformData_windows_h

View File

@ -14,38 +14,23 @@
mozilla::detail::MutexImpl::MutexImpl()
{
// This number was adopted from NSPR.
const static DWORD LockSpinCount = 1500;
#if defined(RELEASE_OR_BETA)
// Vista and later automatically allocate and subsequently leak a debug info
// object for each critical section that we allocate unless we tell the
// system not to do that.
DWORD flags = CRITICAL_SECTION_NO_DEBUG_INFO;
#else
DWORD flags = 0;
#endif // defined(RELEASE_OR_BETA)
BOOL r = InitializeCriticalSectionEx(&platformData()->criticalSection,
LockSpinCount, flags);
MOZ_RELEASE_ASSERT(r);
InitializeSRWLock(&platformData()->lock);
}
mozilla::detail::MutexImpl::~MutexImpl()
{
DeleteCriticalSection(&platformData()->criticalSection);
}
void
mozilla::detail::MutexImpl::lock()
{
EnterCriticalSection(&platformData()->criticalSection);
AcquireSRWLockExclusive(&platformData()->lock);
}
void
mozilla::detail::MutexImpl::unlock()
{
LeaveCriticalSection(&platformData()->criticalSection);
ReleaseSRWLockExclusive(&platformData()->lock);
}
mozilla::detail::MutexImpl::PlatformData*