mozglue/misc/Mutex_windows.cpp
author Nathan Froyd <froydnj@mozilla.com>
Wed, 09 Jan 2019 11:09:24 -0400
changeset 453088 c275c8909c57f4e008756e24de1bc5b3f1333a4f
parent 448947 6f3709b3878117466168c40affa7bca0b60cf75b
child 515833 d407a28318e68dd78af8365a1ea3f8f7384f92c5
permissions -rw-r--r--
Bug 1062533 - part 4 - expose a tryLock method for PlatformMutex; r=mccr8 Chromium IPC locks have this and the API gets used, so we need to expose it ourselves if we're going to use our locks in place of the Chromium IPC locks. This patch changes the mozglue parts; tweaking the xpcom parts is the next patch.

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "mozilla/Assertions.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/PlatformMutex.h"

#include <windows.h>

#include "MutexPlatformData_windows.h"

mozilla::detail::MutexImpl::MutexImpl(recordreplay::Behavior aRecorded) {
  InitializeSRWLock(&platformData()->lock);
}

mozilla::detail::MutexImpl::~MutexImpl() {}

void mozilla::detail::MutexImpl::lock() {
  AcquireSRWLockExclusive(&platformData()->lock);
}

bool mozilla::detail::MutexImpl::tryLock() { return mutexTryLock(); }

bool mozilla::detail::MutexImpl::mutexTryLock() {
  return !!TryAcquireSRWLockExclusive(&platformData()->lock);
}

void mozilla::detail::MutexImpl::unlock() {
  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_);
}