16 #ifndef INCLUDE_NN_NLIB_HEAP_NMALLOC_H_ 17 #define INCLUDE_NN_NLIB_HEAP_NMALLOC_H_ 30 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS) 31 #undef NLIB_VIS_PUBLIC 32 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 35 #ifndef INCLUDE_NN_NLIB_PLATFORM_H_ 56 #define NMALLOC_HEAPOPTION_ENABLE_ENV (0x00000001) 57 #define NMALLOC_HEAPOPTION_CACHE_DISABLE (0x00000004) 63 #pragma comment(linker, "/alternatename:_nmalloc_get_settings=_nmalloc_get_settings_default") 65 #pragma comment(linker, "/alternatename:nmalloc_get_settings=nmalloc_get_settings_default") 85 kNmallocQueryDump = 0,
86 kNmallocQueryPageSize,
87 kNmallocQueryAllocatedSize,
88 kNmallocQueryFreeSize,
89 kNmallocQuerySystemSize,
90 kNmallocQueryMaxAllocatableSize,
92 kNmallocQueryHeapHash,
93 kNmallocQueryUnifyFreelist,
94 kNmallocQuerySetColor,
95 kNmallocQueryGetColor,
98 kNmallocQueryCacheMin_,
99 kNmallocQueryCheckCache,
100 kNmallocQueryClearCache,
101 kNmallocQueryFinalizeCache,
102 kNmallocQueryFreeSizeNx,
103 kNmallocQueryMaxAllocatableSizeNx,
104 NMALLOC_QUERY_DUMP = kNmallocQueryDump,
105 NMALLOC_QUERY_PAGE_SIZE = kNmallocQueryPageSize,
106 NMALLOC_QUERY_ALLOCATED_SIZE = kNmallocQueryAllocatedSize,
107 NMALLOC_QUERY_FREE_SIZE = kNmallocQueryFreeSize,
108 NMALLOC_QUERY_SYSTEM_SIZE = kNmallocQuerySystemSize,
109 NMALLOC_QUERY_MAX_ALLOCATABLE_SIZE = kNmallocQueryMaxAllocatableSize,
110 NMALLOC_QUERY_IS_CLEAN = kNmallocQueryIsClean,
111 NMALLOC_QUERY_HEAP_HASH = kNmallocQueryHeapHash,
112 NMALLOC_QUERY_UNIFY_FREELIST = kNmallocQueryUnifyFreelist,
113 NMALLOC_QUERY_SET_COLOR = kNmallocQuerySetColor,
114 NMALLOC_QUERY_GET_COLOR = kNmallocQueryGetColor,
115 NMALLOC_QUERY_SET_NAME = kNmallocQuerySetName,
116 NMALLOC_QUERY_GET_NAME = kNmallocQueryGetName,
117 NMALLOC_QUERY_CACHE_MIN_ = kNmallocQueryCacheMin_,
118 NMALLOC_QUERY_CHECK_CACHE = kNmallocQueryCheckCache,
119 NMALLOC_QUERY_CLEAR_CACHE = kNmallocQueryClearCache,
120 NMALLOC_QUERY_FINALIZE_CACHE = kNmallocQueryFinalizeCache,
121 NMALLOC_QUERY_FREE_SIZE_NX = kNmallocQueryFreeSizeNx,
122 NMALLOC_QUERY_MAX_ALLOCATABLE_SIZE_NX = kNmallocQueryMaxAllocatableSizeNx
136 NLIB_ATTRIBUTE_ASSUME_ALIGNED(8);
162 template <
typename T>
163 struct NMallocStlAllocator {
164 typedef size_t size_type;
165 typedef T value_type;
167 typedef const T* const_pointer;
168 typedef T& reference;
169 typedef const T& const_reference;
170 typedef ptrdiff_t difference_type;
171 template <
typename U>
173 typedef NMallocStlAllocator<U> other;
175 NMallocStlAllocator() {}
176 explicit NMallocStlAllocator(
const NMallocStlAllocator<T>&) {}
177 template <
class _Other>
178 NMallocStlAllocator(
const NMallocStlAllocator<_Other>&) {}
179 pointer allocate(size_type n,
const void* p = 0);
180 void deallocate(pointer p, size_type n) {
188 void construct(pointer p,
const T& t) {
new ((
void*)p) T(t); }
189 void construct(pointer p) {
new ((
void*)p) T(); }
190 #if defined(__cpp_rvalue_references) && defined(__cpp_variadic_templates) 191 template<
class X,
class... ARGS>
192 void construct(X* p, ARGS&&... args) {
193 new ((
void*)p) X(std::forward<ARGS>(args)...);
196 void destroy(pointer ptr) {
205 size_t max_size()
const {
206 size_t cnt = (size_t)-1 /
sizeof(T);
207 return 0 < cnt ? cnt : 1;
209 pointer address(reference value)
const {
return &value; }
210 const_pointer address(const_reference value)
const {
return &value; }
213 template <
typename T>
214 typename NMallocStlAllocator<T>::pointer NMallocStlAllocator<T>::allocate(size_type n,
217 void* pp =
nmalloc(n *
sizeof(T));
218 return reinterpret_cast<T*
>(pp);
221 template <
class T1,
class T2>
222 inline bool operator==(
const NMallocStlAllocator<T1>&,
const NMallocStlAllocator<T2>&) {
226 template <
class T1,
class T2>
227 inline bool operator!=(
const NMallocStlAllocator<T1>&,
const NMallocStlAllocator<T2>&) {
237 #define NLIB_REPLACE_MALLOC \ 239 void* nlib_malloc(size_t n) { \ 242 void nlib_free(void* p) { \ 245 void* nlib_calloc(size_t nmemb, size_t size) { \ 246 return ncalloc(nmemb, size); \ 248 void* nlib_realloc(void* ptr, size_t size) { \ 249 return nrealloc(ptr, size); \ 251 void* nlib_memalign(size_t alignment, size_t size) { \ 252 return nmalloc_aligned(size, alignment); \ 254 void nlib_free_size(void* ptr, size_t size) { \ 255 nfree_size(ptr, size); \ 259 #ifndef NN_PLATFORM_CTR 260 #define NLIB_REPLACE_MALLOC_NEW \ 261 NLIB_REPLACE_MALLOC \ 262 void* operator new(size_t size) { \ 263 return nlib_malloc(size); \ 265 void operator delete(void* ptr) NLIB_NOEXCEPT { \ 268 void* operator new(size_t size, const std::nothrow_t&) NLIB_NOEXCEPT { \ 269 return nlib_malloc(size); \ 271 void operator delete(void* ptr, const std::nothrow_t&) NLIB_NOEXCEPT { \ 274 void* operator new[](size_t size) { return nlib_malloc(size); } \ 275 void operator delete[](void* ptr) NLIB_NOEXCEPT { nlib_free(ptr); } \ 276 void* operator new[](size_t size, const std::nothrow_t&) NLIB_NOEXCEPT \ 277 { return nlib_malloc(size); } \ 278 void operator delete [](void* ptr, const std::nothrow_t&) NLIB_NOEXCEPT { nlib_free(ptr); } \ 279 void operator delete(void* ptr, size_t size) NLIB_NOEXCEPT { \ 280 nlib_free_size(ptr, size); \ 282 void operator delete(void* ptr, size_t size, const std::nothrow_t&) NLIB_NOEXCEPT { \ 283 nlib_free_size(ptr, size); \ 285 void operator delete[](void* ptr, size_t size)NLIB_NOEXCEPT { nlib_free_size(ptr, size); } \ 286 void operator delete[](void* ptr, size_t size, const std::nothrow_t&) NLIB_NOEXCEPT { \ 287 nlib_free_size(ptr, size); \ 290 #define NLIB_REPLACE_MALLOC_NEW \ 291 NLIB_REPLACE_MALLOC \ 292 void* operator new(size_t size) throw(std::bad_alloc) { \ 293 return nlib_malloc(size); \ 295 void operator delete(void* ptr) throw() { \ 298 void* operator new(size_t size, const std::nothrow_t&) throw() { \ 299 return nlib_malloc(size); \ 301 void* operator new[](size_t size) throw(std::bad_alloc) { \ 302 return nlib_malloc(size); \ 304 void operator delete[](void* ptr) throw() { \ 307 void* operator new[](size_t size, const std::nothrow_t&) throw() { \ 308 return nlib_malloc(size); \ 312 #define NLIB_REPLACE_MALLOC \ 313 void* nlib_malloc(size_t n) { \ 316 void nlib_free(void* p) { \ 319 void* nlib_calloc(size_t nmemb, size_t size) { \ 320 return ncalloc(nmemb, size); \ 322 void* nlib_realloc(void* ptr, size_t size) { \ 323 return nrealloc(ptr, size); \ 325 void* nlib_memalign(size_t alignment, size_t size) { \ 326 return nmalloc_aligned(size, alignment); \ 328 void nlib_free_size(void* ptr, size_t size) { \ 329 nfree_size(ptr, size); \ 331 #define NLIB_REPLACE_MALLOC_NEW NLIB_REPLACE_MALLOC 334 #if defined(_MSC_VER) && defined(nx_heap_EXPORTS) 335 #undef NLIB_VIS_PUBLIC 336 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 339 #endif // INCLUDE_NN_NLIB_HEAP_NMALLOC_H_ void nfree_size(void *p, size_t size)
メモリ領域を解放します。メモリのサイズ情報を利用することで高速にメモリを解放できることがあります。 ...
int(* nmalloc_heapwalk_callback)(void *allocated_ptr, size_t size, void *user_ptr)
nmalloc_walk_allocated_ptrs()から呼び出されるユーザー定義のコールバック関数です。 ...
void * nrealloc(void *ptr, size_t size)
メモリの割り当てを変更します。realloc()C標準関数に相当します。
size_t nmalloc_size(const void *ptr)
ptrに実際に割り当てられたメモリ量を返します。
size_t alloc_size
ヒープ内でユーザーによってアロケートされた領域のサイズの合計です。
ユーザーによって確保されている全てのメモリのアドレスとサイズを表示します。
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
bool operator!=(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価でなければ、trueを返します。
errno_t nmalloc_query(int query,...)
ヒープに関する詳細なデータの取得や操作を行います。
void * ncalloc(size_t nmemb, size_t size)
0に初期化される要素とメモリの配列を割り当てます。
void nfree(void *p)
メモリ領域を解放します。free()C標準関数に相当します。
unsigned int heap_option
ヒープオプションを指定します。デフォルトは0です。
size_t alloc_count
ヒープ内でユーザーによってアロケートされた領域の数です。
size_t size
nmallocが利用する最大のメモリサイズを指定します。4096バイトの倍数を指定する必要があります。 ...
nmallocの初期設定を行うパラメータを記述します。nmalloc_get_settings()を定義して設定します。 ...
size_t hash
ヒープ内のユーザーによるメモリ確保の状況をハッシュ値にしたものです。
void * nmalloc(size_t size)
指定バイト分のメモリ領域を確保します。malloc()C標準関数に相当します。
ヒープ全体のページの割当密度の概要を視覚的に表示します。1MBを1つのASCIIキャラクタで表現しています。 ...
void * addr
nmallocが利用する領域の先頭へのポインタを指定します。
void nmalloc_get_settings(NMallocSettings *settings)
ユーザーがこの関数を定義することでnmallocの初期化設定をコントロールすることができます。 ...
errno_t nmalloc_walk_allocated_ptrs(nmalloc_heapwalk_callback func, void *user_ptr)
ヒープにアロケートされた領域1つずつに対してコールバック関数func を呼び出します。
NMallocDumpMode
nmalloc_query()関数でkNmallocQueryDumpを指定した場合に第2引数に指定する値の型です。 ...
ユーザーが利用しているヒープ内のメモリの利用状況のサマリが記述される構造体です。
void * nmalloc_aligned(size_t size, size_t algn)
アライメントを指定してメモリ領域を確保します。