1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: fnd_DetailHeap.h
4
5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 13429 $
14 *---------------------------------------------------------------------------*/
15
16 /*! @file
17 @brief Heap に関するAPI の宣言
18
19 */
20
21 #ifndef NN_FND_DETAIL_FND_DETAIL_HEAP_H_
22 #define NN_FND_DETAIL_FND_DETAIL_HEAP_H_
23
24 #include <nn/fnd/detail/fnd_DetailHeapHead.h>
25 #include <nn/fnd/fnd_HeapBase.h>
26 #include <nn/fnd/fnd_MemoryRange.h>
27 #include "fnd_DetailHeapCommon.h"
28
29 #define NN_OS_EXPHEAP_ALLOC_DIR_FRONT 0 // 前方より確保
30 #define NN_OS_EXPHEAP_ALLOC_DIR_REAR 1 // 後方より確保
31 #define NN_OS_EXPHEAP_ALLOC_MODE_FIRST 0
32 #define NN_OS_EXPHEAP_ALLOC_MODE_NEAR 1
33
34 #ifdef __cplusplus
35
36 namespace nn{ namespace fnd{ namespace detail {
37 /*!
38 @addtogroup os os
39 @{
40 */
41 /*!
42 @defgroup os_Heap Heap
43 @brief Heapに関するAPI
44
45 nn/os/os_Heap.h
46 @{
47 */
48 /* =======================================================================
49 定数定義
50 ======================================================================== */
51
52 // メモリ確保方向
53 //enum
54 //{
55 // NN_OS_EXPHEAP_ALLOC_DIR_FRONT, // 前方より確保
56 // NN_OS_EXPHEAP_ALLOC_DIR_REAR // 後方より確保
57 //};
58
59 // メモリ確保モード
60 //enum
61 //{
62 /*
63 この属性値がセットされていると、確保しようとしている
64 メモリのサイズ以上の大きさを持つ、
65 最初に見つかった空き領域からメモリを確保します。
66 */
67 // NN_OS_EXPHEAP_ALLOC_MODE_FIRST,
68
69 /*
70 この属性値がセットされていると、確保しようとしている
71 メモリのサイズに一番近いサイズの空き領域を探し、
72 その空き領域からメモリを確保します。
73 */
74 // NN_OS_EXPHEAP_ALLOC_MODE_NEAR
75 //};
76
77
78 /* =======================================================================
79 型定義
80 ======================================================================== */
81
82 // メモリ毎に呼び出されるコールバック関数の型
83 typedef void (*NNSFndHeapVisitor)(
84 void* memBlock,
85 Heap heap,
86 u32 userParam);
87
88 /* =======================================================================
89 マクロ関数
90 ======================================================================== */
91
92
93
94 /* =======================================================================
95 関数プロトタイプ
96 ======================================================================== */
97 #if ! defined(NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK)
98 /// @cond
99
100 void NNSi_FndDumpHeap(
101 ConstHeap heap);
102
103 /// @endcond
104 #endif
105
106 /*!
107 @brief ヒープを作成します。
108
109 @param[in] heapHandle ヒープのハンドル
110 @param[in] startAddress ヒープ領域の先頭アドレス。
111 @param[in] size ヒープ領域のサイズ。
112 @param[in] optFlag オプションフラグ。
113
114 @return 関数が成功した場合、作成されたヒープのハンドルが返ります。
115 関数が失敗すると、NN_OS_HEAP_INVALID_HANDLE が返ります。
116 */
117 Heap CreateHeap(
118 Heap heapHandle,
119 void* startAddress,
120 u32 size,
121 u16 optFlag = 0);
122
123
124 /*!
125 @brief ヒープを破棄します。
126
127 @param[in] heap ヒープのハンドル。
128
129 @return なし。
130 */
131 void DestroyHeap(
132 Heap heap);
133
134
135 /*!
136 @brief カレントヒープを設定します。
137 プロセス起動時は、システムの用意したデフォルトヒープが設定されています。
138
139 @param[in] heap ヒープのハンドル。
140 @return なし。
141 */
142 void SetCurrentHeap(Heap heap);
143
144
145 /*!
146 @brief カレントヒープのハンドルを取得します。
147 プロセス起動時は、システムの用意したデフォルトヒープが設定されています。
148
149 @return ヒープのハンドル。
150 */
151 Heap GetCurrentHeap(void);
152
153
154 /*!
155 @brief ヒープからメモリを確保します。
156 メモリのアライメントを指定できます。
157 アライメント値を負の値で指定すると、ヒープの空き領域を後方から探します。
158
159 @param[in] heap ヒープのハンドル。
160 @param[in] size 確保するメモリのサイズ(バイト単位)。
161 @param[in] alignment 確保するメモリのアライメント。
162 4,8,16,32,64,128,-4,-8,-16,-32,-64,-128のいずれかの値が指定できます。
163
164 @return メモリの確保が成功した場合、確保したメモリへの
165 ポインタが返ります。
166 失敗した場合、NULLが返ります。
167 */
168 void* AllocFromHeap(
169 Heap heap,
170 u32 size,
171 int alignment = NN_OS_HEAP_DEFAULT_ALIGNMENT);
172
173
174 /*!
175 @brief カレントヒープからメモリを確保します。
176 AllocFromHeap と同等の動作です。
177
178 @param[in] size 確保するメモリのサイズ(バイト単位)。
179 @param[in] alignment 確保するメモリのアライメント。
180 4,8,16,32,64,128,-4,-8,-16,-32,-64,-128のいずれかの値が指定できます。
181
182 @return メモリの確保が成功した場合、確保したメモリへの
183 ポインタが返ります。
184 失敗した場合、NULLが返ります。
185 */
186 inline void* AllocFromCurrentHeap(u32 size, int alignment = NN_OS_HEAP_DEFAULT_ALIGNMENT)
187 {
188 return AllocFromHeap(GetCurrentHeap(), size, alignment);
189 }
190
191 /*!
192 @brief ヒープへメモリを返却します。
193
194 @param[in] heap ヒープのハンドル。
195 @param[in] memBlock 返却するメモリへのポインタ。
196
197 @return なし。
198 */
199 void FreeToHeap(
200 Heap heap,
201 void* memBlock);
202
203
204 /*!
205 @brief カレントヒープへメモリを返却します。
206 FreeToHeap と同等の動作です。
207 @param[in] memBlock 返却するメモリへのポインタ。
208
209 @return なし。
210 */
FreeToCurrentHeap(void * memBlock)211 inline void FreeToCurrentHeap(void* memBlock)
212 {
213 FreeToHeap(GetCurrentHeap(), memBlock);
214 }
215
216 /*!
217 @brief ヒープから確保されたメモリのサイズを変更します。
218
219 @param[in] heap ヒープのハンドル。
220 @param[in] memBlock サイズを変更するメモリへのポインタ。
221 @param[in] size 新しく割り当てるサイズ(バイト単位)。
222
223 @return 関数が成功した場合、変更されたメモリのサイズを返します(バイト単位)。
224 関数が失敗した場合、0 が返ります。
225 */
226 u32 ResizeForMBlockHeap(
227 Heap heap,
228 void* memBlock,
229 u32 size);
230
231 /*!
232 @brief ヒープの空き領域のサイズの合計を取得します。
233
234 @param[in] heap ヒープのハンドル。
235
236 @return ヒープの空き領域のサイズの合計を返します(バイト単位)。
237 */
238 u32 GetTotalFreeSizeForHeap(
239 ConstHeap heap);
240
241
242 /*!
243 @brief ヒープ内の割り当て可能な最大サイズを取得します。
244 メモリのアライメントを指定できます。
245
246 @param[in] heap ヒープのハンドル。
247 @param[in] alignment 確保するメモリのアライメント。
248 4,8,16,32,64,128のいずれかの値が指定できます。
249
250 @return ヒープ内の割り当て可能な最大サイズを返します(バイト単位)。
251 */
252 u32 GetAllocatableSizeForHeap(
253 ConstHeap heap,
254 int alignment = NN_OS_HEAP_DEFAULT_ALIGNMENT);
255
256
257 /*!
258 @brief ヒープのメモリ確保モードをセットします。
259
260 @param[in] heap ヒープのハンドル。
261 @param[in] mode メモリ確保モード。
262
263 @return 以前のヒープのメモリ確保モードを返します。
264 */
265 u16 SetAllocModeForHeap(
266 Heap heap,
267 u16 mode);
268
269 /*!
270 @brief ヒープのメモリ確保モードを取得します。
271
272 @param[in] heap ヒープのハンドル。
273
274 @return ヒープのメモリ確保モードを返します。
275 */
276 u16 GetAllocModeForHeap(
277 Heap heap);
278
279 /*!
280 @brief ヒープのグループIDをセットします。
281
282 @param[in] heap ヒープのハンドル。
283 @param[in] groupID セットするグループID値。
284
285 @return 以前のグループID値が返ります。
286 */
287 u16 SetGroupIDForHeap(
288 Heap heap,
289 u16 groupID);
290
291 /*!
292 @brief ヒープのグループIDを取得します。
293
294 @param[in] heap ヒープのハンドル。
295
296 @return グループID値が返ります。
297 */
298 u16 GetGroupIDForHeap(
299 Heap heap);
300
301 /*!
302 @brief ヒープから割り当てられたメモリ全てに対して、
303 ユーザが指定した関数を呼ばせます。
304 visitor関数で呼ばれるメモリの順番は、確保した順番になります。
305
306 visitor の型 NNSFndHeapVisitor は次のように定義されています。
307
308 typedef void (*NNSFndHeapVisitor)(
309 void* memBlock,
310 Heap heap,
311 u32 userParam);
312
313 memBlock メモリへのポインタ。
314 heap メモリを含有するヒープ。
315 userParam ユーザー用パラメータ。
316
317 @param[in] heap ヒープのハンドル。
318 @param[in] visitor 各メモリに対して呼ばせる関数。
319 @param[in] userParam visitor関数に渡すユーザ指定のパラメータ
320
321 @return なし。
322 */
323 void VisitAllocatedForHeap(
324 Heap heap,
325 NNSFndHeapVisitor visitor,
326 u32 userParam);
327
328 /*!
329 @brief ヒープから確保されたメモリのサイズを取得します。
330
331 @param[in] memBlock サイズを取得するメモリへのポインタ。
332
333 @return 指定したメモリのサイズを返します(バイト単位)。
334 */
335 u32 GetSizeForMBlockHeap(
336 const void* memBlock);
337
338 /*!
339 @brief ヒープから確保されたメモリのグループIDを取得します。
340
341 @param[in] memBlock グループIDを取得するメモリへのポインタ。
342
343 @return 指定したメモリのグループIDが返ります。
344 */
345 u16 GetGroupIDForMBlockHeap(
346 const void* memBlock);
347
348 /*!
349 @brief ヒープから確保されたメモリの確保方向を取得します。
350
351 @param[in] memBlock メモリへのポインタ。
352
353 @return 指定したメモリの確保方向が返ります。
354 */
355 u16 GetAllocDirForMBlockHeap(
356 const void* memBlock);
357
358 /*!
359 @brief 拡張ヒープの空き領域を解放し、拡張ヒープが使用するメモリ領域を縮小します。
360
361 @param[in] heap ヒープのハンドル。
362 @param[in] mode 縮小する方向を指定します。
363
364 @return ヒープが縮小されることにより空いたメモリ領域の範囲を返します。
365 */
366 MemoryRange AdjustHeap(
367 Heap heap,
368 HeapAdjustMode mode);
369
370 /*!
371 @brief アライメントの際に発生する隙間の領域を再利用するかどうかを
372 設定します。
373
374 @param[in] heap ヒープのハンドル。
375 @param[in] reuse true の場合、アライメントで発生する領域を再利用します。
376
377 @return 以前の設定値が返ります。
378 */
379 bool UseMarginOfAlignmentForHeap(
380 Heap heap,
381 bool reuse);
382
383
384 #if defined(NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK)
CheckHeap(ConstHeap,u32)385 inline bool CheckHeap(ConstHeap, u32) { return true; }
CheckForMBlockHeap(const void *,ConstHeap,u32)386 inline bool CheckForMBlockHeap(const void*, ConstHeap, u32) { return true; }
387 #else
388
389 /*!
390 @brief ヒープが破壊されていないかどうかをチェックします。
391
392 @param[in] heap ヒープのハンドル。
393 @param[in] optFlag フラグ。
394
395 @return ヒープが正常だった場合 true を返します。
396 ヒープにエラーがあった場合、false を返します。
397 */
398 bool CheckHeap(
399 ConstHeap heap,
400 u32 optFlag);
401 /*!
402 @brief ヒープのメモリが破壊されていないかどうかをチェックします。
403
404 @param[in] memBlock チェックするメモリへのポインタ。
405 @param[in] heap ヒープのハンドル。
406 @param[in] optFlag フラグ。
407
408 @return メモリが正常だった場合 true を返します。
409 メモリにエラーがあった場合、false を返します。
410 */
411 bool CheckForMBlockHeap(
412 const void* memBlock,
413 ConstHeap heap,
414 u32 optFlag);
415
416 #endif
417
418
419
420 /*!
421 @}
422 */
423 /*!
424 @}
425 */
426
427
428 }}} // namespace nn::fnd::detail
429
430 #endif // __cplusplus
431
432 /* NN_OS_HEAP_H_ */
433 #endif
434
435