1 // Copyright 2016 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 "partition_alloc/shim/allocator_shim.h"
6
7 #include <ostream>
8
9 #include "partition_alloc/partition_alloc_check.h"
10 #include "partition_alloc/shim/winheap_stubs_win.h"
11
12 namespace {
13
14 using allocator_shim::AllocatorDispatch;
15
DefaultWinHeapMallocImpl(const AllocatorDispatch *,size_t size,void * context)16 void* DefaultWinHeapMallocImpl(const AllocatorDispatch*,
17 size_t size,
18 void* context) {
19 return allocator_shim::WinHeapMalloc(size);
20 }
21
DefaultWinHeapCallocImpl(const AllocatorDispatch * self,size_t n,size_t elem_size,void * context)22 void* DefaultWinHeapCallocImpl(const AllocatorDispatch* self,
23 size_t n,
24 size_t elem_size,
25 void* context) {
26 // Overflow check.
27 const size_t size = n * elem_size;
28 if (elem_size != 0 && size / elem_size != n) {
29 return nullptr;
30 }
31
32 void* result = DefaultWinHeapMallocImpl(self, size, context);
33 if (result) {
34 memset(result, 0, size);
35 }
36 return result;
37 }
38
DefaultWinHeapMemalignImpl(const AllocatorDispatch * self,size_t alignment,size_t size,void * context)39 void* DefaultWinHeapMemalignImpl(const AllocatorDispatch* self,
40 size_t alignment,
41 size_t size,
42 void* context) {
43 PA_CHECK(false) << "The windows heap does not support memalign.";
44 return nullptr;
45 }
46
DefaultWinHeapReallocImpl(const AllocatorDispatch * self,void * address,size_t size,void * context)47 void* DefaultWinHeapReallocImpl(const AllocatorDispatch* self,
48 void* address,
49 size_t size,
50 void* context) {
51 return allocator_shim::WinHeapRealloc(address, size);
52 }
53
DefaultWinHeapFreeImpl(const AllocatorDispatch *,void * address,void * context)54 void DefaultWinHeapFreeImpl(const AllocatorDispatch*,
55 void* address,
56 void* context) {
57 allocator_shim::WinHeapFree(address);
58 }
59
DefaultWinHeapGetSizeEstimateImpl(const AllocatorDispatch *,void * address,void * context)60 size_t DefaultWinHeapGetSizeEstimateImpl(const AllocatorDispatch*,
61 void* address,
62 void* context) {
63 return allocator_shim::WinHeapGetSizeEstimate(address);
64 }
65
DefaultWinHeapAlignedMallocImpl(const AllocatorDispatch *,size_t size,size_t alignment,void * context)66 void* DefaultWinHeapAlignedMallocImpl(const AllocatorDispatch*,
67 size_t size,
68 size_t alignment,
69 void* context) {
70 return allocator_shim::WinHeapAlignedMalloc(size, alignment);
71 }
72
DefaultWinHeapAlignedReallocImpl(const AllocatorDispatch *,void * ptr,size_t size,size_t alignment,void * context)73 void* DefaultWinHeapAlignedReallocImpl(const AllocatorDispatch*,
74 void* ptr,
75 size_t size,
76 size_t alignment,
77 void* context) {
78 return allocator_shim::WinHeapAlignedRealloc(ptr, size, alignment);
79 }
80
DefaultWinHeapAlignedFreeImpl(const AllocatorDispatch *,void * ptr,void * context)81 void DefaultWinHeapAlignedFreeImpl(const AllocatorDispatch*,
82 void* ptr,
83 void* context) {
84 allocator_shim::WinHeapAlignedFree(ptr);
85 }
86
87 } // namespace
88
89 // Guarantee that default_dispatch is compile-time initialized to avoid using
90 // it before initialization (allocations before main in release builds with
91 // optimizations disabled).
92 constexpr AllocatorDispatch AllocatorDispatch::default_dispatch = {
93 &DefaultWinHeapMallocImpl,
94 &DefaultWinHeapMallocImpl, /* alloc_unchecked_function */
95 &DefaultWinHeapCallocImpl,
96 &DefaultWinHeapMemalignImpl,
97 &DefaultWinHeapReallocImpl,
98 &DefaultWinHeapFreeImpl,
99 &DefaultWinHeapGetSizeEstimateImpl,
100 nullptr, /* good_size */
101 nullptr, /* claimed_address */
102 nullptr, /* batch_malloc_function */
103 nullptr, /* batch_free_function */
104 nullptr, /* free_definite_size_function */
105 nullptr, /* try_free_default_function */
106 &DefaultWinHeapAlignedMallocImpl,
107 &DefaultWinHeapAlignedReallocImpl,
108 &DefaultWinHeapAlignedFreeImpl,
109 nullptr, /* next */
110 };
111