1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/mac/scoped_mach_vm.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace base {
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace mac {
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ScopedMachVM::reset(vm_address_t address, vm_size_t size) {
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(address % PAGE_SIZE == 0);
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(size % PAGE_SIZE == 0);
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (size_) {
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (address_ < address) {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      vm_deallocate(mach_task_self(),
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    address_,
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    std::min(size_, address - address_));
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (address_ + size_ > address + size) {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      vm_address_t deallocate_start = std::max(address_, address + size);
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      vm_deallocate(mach_task_self(),
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    deallocate_start,
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    address_ + size_ - deallocate_start);
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  address_ = address;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  size_ = size;
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace mac
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace base
34