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