bool VolatileBuffer::Lock(void** aBuf) { MutexAutoLock lock(mMutex); MOZ_ASSERT(mBuf, "Attempting to lock an uninitialized VolatileBuffer"); *aBuf = mBuf; if (++mLockCount > 1 || OnHeap()) { return true; } // MEM_RESET_UNDO's behavior is undefined when called on memory that // hasn't been MEM_RESET. if (mFirstLock) { mFirstLock = false; return true; } void* addr = VirtualAllocEx(GetCurrentProcess(), mBuf, mSize, MEM_RESET_UNDO, PAGE_READWRITE); return !!addr; }
VolatileBuffer::~VolatileBuffer() { if (OnHeap()) { free(mBuf); } else { vm_deallocate(mach_task_self(), (vm_address_t)mBuf, mSize); } }
size_t VolatileBuffer::NonHeapSizeOfExcludingThis() const { if (OnHeap()) { return 0; } return (mSize + 4095) & ~4095; }
VolatileBuffer::~VolatileBuffer() { MOZ_ASSERT(mLockCount == 0, "Being destroyed with non-zero lock count?"); if (OnHeap()) { free(mBuf); } else { vm_deallocate(mach_task_self(), (vm_address_t)mBuf, mSize); } }
size_t VolatileBuffer::NonHeapSizeOfExcludingThis() const { if (OnHeap()) { return 0; } unsigned long pagemask = getpagesize() - 1; return (mSize + pagemask) & ~pagemask; }
VolatileBuffer::~VolatileBuffer() { if (OnHeap()) { #ifdef MOZ_MEMORY free(mBuf); #else _aligned_free(mBuf); #endif } else { VirtualFreeEx(GetCurrentProcess(), mBuf, 0, MEM_RELEASE); } }
size_t VolatileBuffer::HeapSizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const { if (OnHeap()) { #ifdef MOZ_MEMORY return aMallocSizeOf(mBuf); #else return mSize; #endif } return 0; }
VolatileBuffer::~VolatileBuffer() { MOZ_ASSERT(mLockCount == 0, "Being destroyed with non-zero lock count?"); if (OnHeap()) { #ifdef MOZ_MEMORY free(mBuf); #else _aligned_free(mBuf); #endif } else { VirtualFreeEx(GetCurrentProcess(), mBuf, 0, MEM_RELEASE); } }
void VolatileBuffer::Unlock() { MOZ_ASSERT(mLockCount > 0, "VolatileBuffer unlocked too many times!"); if (--mLockCount || OnHeap()) { return; } void* addr = VirtualAllocEx(GetCurrentProcess(), mBuf, mSize, MEM_RESET, PAGE_READWRITE); MOZ_ASSERT(addr, "Failed to MEM_RESET"); }
void VolatileBuffer::Unlock() { MOZ_ASSERT(mLockCount > 0, "VolatileBuffer unlocked too many times!"); if (--mLockCount || OnHeap()) { return; } int state = VM_PURGABLE_VOLATILE | VM_VOLATILE_GROUP_DEFAULT; DebugOnly<kern_return_t> ret = vm_purgable_control(mach_task_self(), (vm_address_t)mBuf, VM_PURGABLE_SET_STATE, &state); MOZ_ASSERT(ret == KERN_SUCCESS, "Failed to set buffer as purgable"); }
bool VolatileBuffer::Lock(void** aBuf) { MOZ_ASSERT(mBuf, "Attempting to lock an uninitialized VolatileBuffer"); *aBuf = mBuf; if (++mLockCount > 1 || OnHeap()) { return true; } int state = VM_PURGABLE_NONVOLATILE; kern_return_t ret = vm_purgable_control(mach_task_self(), (vm_address_t)mBuf, VM_PURGABLE_SET_STATE, &state); return ret == KERN_SUCCESS && !(state & VM_PURGABLE_EMPTY); }
size_t VolatileBuffer::HeapSizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const { return OnHeap() ? aMallocSizeOf(mBuf) : 0; }