1 /* 2 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2007-2009 Torch Mobile, Inc. All rights reserved 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public License 16 * along with this library; see the file COPYING.LIB. If not, write to 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 * 20 */ 21 22 #ifndef WTF_FastMallocWinCE_h 23 #define WTF_FastMallocWinCE_h 24 25 #include <new.h> 26 27 #ifdef __cplusplus 28 #include <new> 29 #include "MemoryManager.h" 30 extern "C" { 31 #endif 32 33 void* fastMalloc(size_t n); 34 void* fastCalloc(size_t n_elements, size_t element_size); 35 void fastFree(void* p); 36 void* fastRealloc(void* p, size_t n); 37 void* fastZeroedMalloc(size_t n); 38 // These functions return 0 if an allocation fails. 39 void* tryFastMalloc(size_t n); 40 void* tryFastZeroedMalloc(size_t n); 41 void* tryFastCalloc(size_t n_elements, size_t element_size); 42 void* tryFastRealloc(void* p, size_t n); 43 char* fastStrDup(const char*); 44 45 #ifndef NDEBUG 46 void fastMallocForbid(); 47 void fastMallocAllow(); 48 #endif 49 50 #if !defined(USE_SYSTEM_MALLOC) || !USE_SYSTEM_MALLOC 51 52 #define malloc(n) fastMalloc(n) 53 #define calloc(n_elements, element_size) fastCalloc(n_elements, element_size) 54 #define realloc(p, n) fastRealloc(p, n) 55 #define free(p) fastFree(p) 56 #define strdup(p) fastStrDup(p) 57 58 #else 59 60 #define strdup(p) _strdup(p) 61 62 #endif 63 64 #ifdef __cplusplus 65 } 66 #endif 67 68 #ifdef __cplusplus 69 #if !defined(USE_SYSTEM_MALLOC) || !USE_SYSTEM_MALLOC 70 static inline void* __cdecl operator new(size_t s) { return fastMalloc(s); } 71 static inline void __cdecl operator delete(void* p) { fastFree(p); } 72 static inline void* __cdecl operator new[](size_t s) { return fastMalloc(s); } 73 static inline void __cdecl operator delete[](void* p) { fastFree(p); } 74 static inline void* operator new(size_t s, const std::nothrow_t&) throw() { return fastMalloc(s); } 75 static inline void operator delete(void* p, const std::nothrow_t&) throw() { fastFree(p); } 76 static inline void* operator new[](size_t s, const std::nothrow_t&) throw() { return fastMalloc(s); } 77 static inline void operator delete[](void* p, const std::nothrow_t&) throw() { fastFree(p); } 78 #endif 79 80 namespace WTF { 81 // This defines a type which holds an unsigned integer and is the same 82 // size as the minimally aligned memory allocation. 83 typedef unsigned long long AllocAlignmentInteger; 84 85 namespace Internal { 86 enum AllocType { // Start with an unusual number instead of zero, because zero is common. 87 AllocTypeMalloc = 0x375d6750, // Encompasses fastMalloc, fastZeroedMalloc, fastCalloc, fastRealloc. 88 AllocTypeClassNew, // Encompasses class operator new from FastAllocBase. 89 AllocTypeClassNewArray, // Encompasses class operator new[] from FastAllocBase. 90 AllocTypeFastNew, // Encompasses fastNew. 91 AllocTypeFastNewArray, // Encompasses fastNewArray. 92 AllocTypeNew, // Encompasses global operator new. 93 AllocTypeNewArray // Encompasses global operator new[]. 94 }; 95 } 96 97 98 #if ENABLE(FAST_MALLOC_MATCH_VALIDATION) 99 100 // Malloc validation is a scheme whereby a tag is attached to an 101 // allocation which identifies how it was originally allocated. 102 // This allows us to verify that the freeing operation matches the 103 // allocation operation. If memory is allocated with operator new[] 104 // but freed with free or delete, this system would detect that. 105 // In the implementation here, the tag is an integer prepended to 106 // the allocation memory which is assigned one of the AllocType 107 // enumeration values. An alternative implementation of this 108 // scheme could store the tag somewhere else or ignore it. 109 // Users of FastMalloc don't need to know or care how this tagging 110 // is implemented. 111 112 namespace Internal { 113 114 // Return the AllocType tag associated with the allocated block p. 115 inline AllocType fastMallocMatchValidationType(const void* p) 116 { 117 const AllocAlignmentInteger* type = static_cast<const AllocAlignmentInteger*>(p) - 1; 118 return static_cast<AllocType>(*type); 119 } 120 121 // Return the address of the AllocType tag associated with the allocated block p. 122 inline AllocAlignmentInteger* fastMallocMatchValidationValue(void* p) 123 { 124 return reinterpret_cast<AllocAlignmentInteger*>(static_cast<char*>(p) - sizeof(AllocAlignmentInteger)); 125 } 126 127 // Set the AllocType tag to be associaged with the allocated block p. 128 inline void setFastMallocMatchValidationType(void* p, AllocType allocType) 129 { 130 AllocAlignmentInteger* type = static_cast<AllocAlignmentInteger*>(p) - 1; 131 *type = static_cast<AllocAlignmentInteger>(allocType); 132 } 133 134 // Handle a detected alloc/free mismatch. By default this calls CRASH(). 135 void fastMallocMatchFailed(void* p); 136 137 } // namespace Internal 138 139 // This is a higher level function which is used by FastMalloc-using code. 140 inline void fastMallocMatchValidateMalloc(void* p, Internal::AllocType allocType) 141 { 142 if (!p) 143 return; 144 145 Internal::setFastMallocMatchValidationType(p, allocType); 146 } 147 148 // This is a higher level function which is used by FastMalloc-using code. 149 inline void fastMallocMatchValidateFree(void* p, Internal::AllocType allocType) 150 { 151 if (!p) 152 return; 153 154 if (Internal::fastMallocMatchValidationType(p) != allocType) 155 Internal::fastMallocMatchFailed(p); 156 Internal::setFastMallocMatchValidationType(p, Internal::AllocTypeMalloc); // Set it to this so that fastFree thinks it's OK. 157 } 158 159 #else 160 161 inline void fastMallocMatchValidateMalloc(void*, Internal::AllocType) 162 { 163 } 164 165 inline void fastMallocMatchValidateFree(void*, Internal::AllocType) 166 { 167 } 168 169 #endif 170 171 } // namespace WTF 172 173 #endif 174 175 #endif // WTF_FastMallocWinCE_h 176