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;
}
Пример #2
0
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;
}
Пример #4
0
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);
  }
}
Пример #5
0
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");
}
Пример #10
0
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");
}
Пример #11
0
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);
}
Пример #12
0
size_t
VolatileBuffer::HeapSizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
  return OnHeap() ? aMallocSizeOf(mBuf) : 0;
}