Bug 1364624 - Switch from CRITICALSECTION to SRWLOCK. r=froydnj
☠☠ backed out by e33e5049d9f3 ☠ ☠
authorEric Rahm <erahm@mozilla.com>
Mon, 23 Apr 2018 10:45:20 -0700
changeset 468930 3802f86e1bd10c3e8d5d810c18675aa999bdefa7
parent 468929 96a90528f1cd14f1a863ab0cbcaf9107b30e7a51
child 468931 27d5c7a1d4c112687b78b4a9f86857378bfc67bb
push id9165
push userasasaki@mozilla.com
push dateThu, 26 Apr 2018 21:04:54 +0000
treeherdermozilla-beta@064c3804de2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersfroydnj
bugs1364624
milestone61.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1364624 - Switch from CRITICALSECTION to SRWLOCK. r=froydnj
mozglue/misc/ConditionVariable_windows.cpp
mozglue/misc/MutexPlatformData_windows.h
mozglue/misc/Mutex_windows.cpp
--- a/mozglue/misc/ConditionVariable_windows.cpp
+++ b/mozglue/misc/ConditionVariable_windows.cpp
@@ -49,31 +49,31 @@ void
 mozilla::detail::ConditionVariableImpl::notify_all()
 {
   WakeAllConditionVariable(&platformData()->cv_);
 }
 
 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);
 }
 
 mozilla::CVStatus
 mozilla::detail::ConditionVariableImpl::wait_for(MutexImpl& lock,
                                                  const mozilla::TimeDuration& rel_time)
 {
   if (rel_time == mozilla::TimeDuration::Forever()) {
     wait(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
   // greater than UINT32_MAX, resulting in the correct INFINITE wait. We also
   // don't want to round sub-millisecond waits to 0, as that wastes energy (see
   // bug 1437167 comment 6), so we instead round submillisecond waits to 1ms.
   double msecd = rel_time.ToMilliseconds();
   DWORD msec;
@@ -84,17 +84,17 @@ mozilla::detail::ConditionVariableImpl::
   } else {
     msec = static_cast<DWORD>(msecd);
     // Round submillisecond waits to 1ms.
     if (msec == 0 && !rel_time.IsZero()) {
       msec = 1;
     }
   }
 
-  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);
   return CVStatus::Timeout;
 }
 
 mozilla::detail::ConditionVariableImpl::~ConditionVariableImpl()
 {
--- a/mozglue/misc/MutexPlatformData_windows.h
+++ b/mozglue/misc/MutexPlatformData_windows.h
@@ -8,12 +8,12 @@
 #define MutexPlatformData_windows_h
 
 #include <windows.h>
 
 #include "mozilla/PlatformMutex.h"
 
 struct mozilla::detail::MutexImpl::PlatformData
 {
-  CRITICAL_SECTION criticalSection;
+  SRWLOCK lock;
 };
 
 #endif // MutexPlatformData_windows_h
--- a/mozglue/misc/Mutex_windows.cpp
+++ b/mozglue/misc/Mutex_windows.cpp
@@ -9,48 +9,33 @@
 #include "mozilla/PlatformMutex.h"
 
 #include <windows.h>
 
 #include "MutexPlatformData_windows.h"
 
 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*
 mozilla::detail::MutexImpl::platformData()
 {
   static_assert(sizeof(platformData_) >= sizeof(PlatformData),
                 "platformData_ is too small");
   return reinterpret_cast<PlatformData*>(platformData_);