xref: /aosp_15_r20/external/cronet/base/apple/scoped_mach_vm.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/apple/scoped_mach_vm.h"
6 
7 #include "base/apple/mach_logging.h"
8 
9 namespace base::apple {
10 
reset(vm_address_t address,vm_size_t size)11 void ScopedMachVM::reset(vm_address_t address, vm_size_t size) {
12   DCHECK_EQ(address % PAGE_SIZE, 0u);
13   DCHECK_EQ(size % PAGE_SIZE, 0u);
14   reset_unaligned(address, size);
15 }
16 
reset_unaligned(vm_address_t address,vm_size_t size)17 void ScopedMachVM::reset_unaligned(vm_address_t address, vm_size_t size) {
18   if (size_) {
19     if (address_ < address) {
20       kern_return_t kr = vm_deallocate(mach_task_self(), address_,
21                                        std::min(size_, address - address_));
22       MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate";
23     }
24     if (address_ + size_ > address + size) {
25       vm_address_t deallocate_start = std::max(address_, address + size);
26       kern_return_t kr = vm_deallocate(mach_task_self(), deallocate_start,
27                                        address_ + size_ - deallocate_start);
28       MACH_DCHECK(kr == KERN_SUCCESS, kr) << "vm_deallocate";
29     }
30   }
31 
32   address_ = address;
33   size_ = size;
34 }
35 
36 }  // namespace base::apple
37