Source code
Revision control
Copy as Markdown
Other Tools
/* 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
#include "mozilla/Futex.h"
#include <windows.h>
namespace mozilla {
static DWORD ConvertTimeout(const TimeDuration* aTimeout) {
if (!aTimeout || *aTimeout == TimeDuration::Forever()) {
return INFINITE;
}
double msecd = aTimeout->ToMilliseconds();
if (msecd < 0.0) {
return 0;
}
if (msecd > UINT32_MAX) {
return INFINITE;
}
DWORD msec = static_cast<DWORD>(msecd);
if (msec == 0 && !aTimeout->IsZero()) {
msec = 1;
}
return msec;
}
template <typename T>
bool FutexImpl<T>::wait(T aExpected, const TimeDuration* aTimeout) {
return ::WaitOnAddress(reinterpret_cast<volatile void*>(&mValue), &aExpected,
sizeof(aExpected), ConvertTimeout(aTimeout));
}
template <typename T>
void FutexImpl<T>::wake() {
::WakeByAddressSingle(reinterpret_cast<void*>(&mValue));
}
template <typename T>
void FutexImpl<T>::wakeAll() {
::WakeByAddressAll(reinterpret_cast<void*>(&mValue));
}
template struct FutexImpl<uint32_t>;
template struct FutexImpl<uint8_t>;
} // namespace mozilla