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