gecko-dev/memory/volatile/VolatileBufferFallback.cpp
Mike Hommey d7c4757af3 Bug 1423107 - Replace uses of moz_posix_memalign with posix_memalign. r=njn
moz_posix_memalign is a wrapper for posix_memalign that only exists if
posix_memalign exists.

On OSX, it has a fallback for an under-specified bug where it
purportedly returns a pointer that doesn't have the requested alignment.
That fallback was added in bug 414946, over 6 years ago, before jemalloc
was even enabled on OSX.

Considering posix_memalign is used directly in many other places in
Gecko, that we almost always use mozjemalloc, which doesn't have these
problems, and that in all likeliness, the bug was in some old version of
OSX that is not supported anymore, the fallback does not seem all that
useful.

So, just use posix_memalign directly.

--HG--
extra : rebase_source : b2151b5fb598dc20cbd70308555059f7545b18b2
2017-12-05 16:46:17 +09:00

88 lines
1.7 KiB
C++

/* 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 "VolatileBuffer.h"
#include "mozilla/Assertions.h"
#include "mozilla/mozalloc.h"
#ifdef MOZ_MEMORY
int posix_memalign(void** memptr, size_t alignment, size_t size);
#endif
namespace mozilla {
VolatileBuffer::VolatileBuffer()
: mMutex("VolatileBuffer")
, mBuf(nullptr)
, mSize(0)
, mLockCount(0)
{
}
bool VolatileBuffer::Init(size_t aSize, size_t aAlignment)
{
MOZ_ASSERT(!mSize && !mBuf, "Init called twice");
MOZ_ASSERT(!(aAlignment % sizeof(void *)),
"Alignment must be multiple of pointer size");
mSize = aSize;
#if defined(MOZ_MEMORY) || defined(HAVE_POSIX_MEMALIGN)
if (posix_memalign(&mBuf, aAlignment, aSize) != 0) {
return false;
}
#else
#error "No memalign implementation found"
#endif
return !!mBuf;
}
VolatileBuffer::~VolatileBuffer()
{
MOZ_ASSERT(mLockCount == 0, "Being destroyed with non-zero lock count?");
free(mBuf);
}
bool
VolatileBuffer::Lock(void** aBuf)
{
MutexAutoLock lock(mMutex);
MOZ_ASSERT(mBuf, "Attempting to lock an uninitialized VolatileBuffer");
*aBuf = mBuf;
mLockCount++;
return true;
}
void
VolatileBuffer::Unlock()
{
MutexAutoLock lock(mMutex);
mLockCount--;
MOZ_ASSERT(mLockCount >= 0, "VolatileBuffer unlocked too many times!");
}
bool
VolatileBuffer::OnHeap() const
{
return true;
}
size_t
VolatileBuffer::HeapSizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(mBuf);
}
size_t
VolatileBuffer::NonHeapSizeOfExcludingThis() const
{
return 0;
}
} // namespace mozilla