/*---------------------------------------------------------------------------* Project: Horizon File: fnd_DetailHeap.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 13429 $ *---------------------------------------------------------------------------*/ /*! @file @brief Heap に関するAPI の宣言 */ #ifndef NN_FND_DETAIL_FND_DETAIL_HEAP_H_ #define NN_FND_DETAIL_FND_DETAIL_HEAP_H_ #include #include #include #include "fnd_DetailHeapCommon.h" #define NN_OS_EXPHEAP_ALLOC_DIR_FRONT 0 // 前方より確保 #define NN_OS_EXPHEAP_ALLOC_DIR_REAR 1 // 後方より確保 #define NN_OS_EXPHEAP_ALLOC_MODE_FIRST 0 #define NN_OS_EXPHEAP_ALLOC_MODE_NEAR 1 #ifdef __cplusplus namespace nn{ namespace fnd{ namespace detail { /*! @addtogroup os os @{ */ /*! @defgroup os_Heap Heap @brief Heapに関するAPI nn/os/os_Heap.h @{ */ /* ======================================================================= 定数定義 ======================================================================== */ // メモリ確保方向 //enum //{ // NN_OS_EXPHEAP_ALLOC_DIR_FRONT, // 前方より確保 // NN_OS_EXPHEAP_ALLOC_DIR_REAR // 後方より確保 //}; // メモリ確保モード //enum //{ /* この属性値がセットされていると、確保しようとしている メモリのサイズ以上の大きさを持つ、 最初に見つかった空き領域からメモリを確保します。 */ // NN_OS_EXPHEAP_ALLOC_MODE_FIRST, /* この属性値がセットされていると、確保しようとしている メモリのサイズに一番近いサイズの空き領域を探し、 その空き領域からメモリを確保します。 */ // NN_OS_EXPHEAP_ALLOC_MODE_NEAR //}; /* ======================================================================= 型定義 ======================================================================== */ // メモリ毎に呼び出されるコールバック関数の型 typedef void (*NNSFndHeapVisitor)( void* memBlock, Heap heap, u32 userParam); /* ======================================================================= マクロ関数 ======================================================================== */ /* ======================================================================= 関数プロトタイプ ======================================================================== */ #if ! defined(NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK) /// @cond void NNSi_FndDumpHeap( ConstHeap heap); /// @endcond #endif /*! @brief ヒープを作成します。 @param[in] heapHandle ヒープのハンドル @param[in] startAddress ヒープ領域の先頭アドレス。 @param[in] size ヒープ領域のサイズ。 @param[in] optFlag オプションフラグ。 @return 関数が成功した場合、作成されたヒープのハンドルが返ります。 関数が失敗すると、NN_OS_HEAP_INVALID_HANDLE が返ります。 */ Heap CreateHeap( Heap heapHandle, void* startAddress, u32 size, u16 optFlag = 0); /*! @brief ヒープを破棄します。 @param[in] heap ヒープのハンドル。 @return なし。 */ void DestroyHeap( Heap heap); /*! @brief カレントヒープを設定します。 プロセス起動時は、システムの用意したデフォルトヒープが設定されています。 @param[in] heap ヒープのハンドル。 @return なし。 */ void SetCurrentHeap(Heap heap); /*! @brief カレントヒープのハンドルを取得します。 プロセス起動時は、システムの用意したデフォルトヒープが設定されています。 @return ヒープのハンドル。 */ Heap GetCurrentHeap(void); /*! @brief ヒープからメモリを確保します。 メモリのアライメントを指定できます。 アライメント値を負の値で指定すると、ヒープの空き領域を後方から探します。 @param[in] heap ヒープのハンドル。 @param[in] size 確保するメモリのサイズ(バイト単位)。 @param[in] alignment 確保するメモリのアライメント。 4,8,16,32,64,128,-4,-8,-16,-32,-64,-128のいずれかの値が指定できます。 @return メモリの確保が成功した場合、確保したメモリへの ポインタが返ります。 失敗した場合、NULLが返ります。 */ void* AllocFromHeap( Heap heap, u32 size, int alignment = NN_OS_HEAP_DEFAULT_ALIGNMENT); /*! @brief カレントヒープからメモリを確保します。 AllocFromHeap と同等の動作です。 @param[in] size 確保するメモリのサイズ(バイト単位)。 @param[in] alignment 確保するメモリのアライメント。 4,8,16,32,64,128,-4,-8,-16,-32,-64,-128のいずれかの値が指定できます。 @return メモリの確保が成功した場合、確保したメモリへの ポインタが返ります。 失敗した場合、NULLが返ります。 */ inline void* AllocFromCurrentHeap(u32 size, int alignment = NN_OS_HEAP_DEFAULT_ALIGNMENT) { return AllocFromHeap(GetCurrentHeap(), size, alignment); } /*! @brief ヒープへメモリを返却します。 @param[in] heap ヒープのハンドル。 @param[in] memBlock 返却するメモリへのポインタ。 @return なし。 */ void FreeToHeap( Heap heap, void* memBlock); /*! @brief カレントヒープへメモリを返却します。 FreeToHeap と同等の動作です。 @param[in] memBlock 返却するメモリへのポインタ。 @return なし。 */ inline void FreeToCurrentHeap(void* memBlock) { FreeToHeap(GetCurrentHeap(), memBlock); } /*! @brief ヒープから確保されたメモリのサイズを変更します。 @param[in] heap ヒープのハンドル。 @param[in] memBlock サイズを変更するメモリへのポインタ。 @param[in] size 新しく割り当てるサイズ(バイト単位)。 @return 関数が成功した場合、変更されたメモリのサイズを返します(バイト単位)。 関数が失敗した場合、0 が返ります。 */ u32 ResizeForMBlockHeap( Heap heap, void* memBlock, u32 size); /*! @brief ヒープの空き領域のサイズの合計を取得します。 @param[in] heap ヒープのハンドル。 @return ヒープの空き領域のサイズの合計を返します(バイト単位)。 */ u32 GetTotalFreeSizeForHeap( ConstHeap heap); /*! @brief ヒープ内の割り当て可能な最大サイズを取得します。 メモリのアライメントを指定できます。 @param[in] heap ヒープのハンドル。 @param[in] alignment 確保するメモリのアライメント。 4,8,16,32,64,128のいずれかの値が指定できます。 @return ヒープ内の割り当て可能な最大サイズを返します(バイト単位)。 */ u32 GetAllocatableSizeForHeap( ConstHeap heap, int alignment = NN_OS_HEAP_DEFAULT_ALIGNMENT); /*! @brief ヒープのメモリ確保モードをセットします。 @param[in] heap ヒープのハンドル。 @param[in] mode メモリ確保モード。 @return 以前のヒープのメモリ確保モードを返します。 */ u16 SetAllocModeForHeap( Heap heap, u16 mode); /*! @brief ヒープのメモリ確保モードを取得します。 @param[in] heap ヒープのハンドル。 @return ヒープのメモリ確保モードを返します。 */ u16 GetAllocModeForHeap( Heap heap); /*! @brief ヒープのグループIDをセットします。 @param[in] heap ヒープのハンドル。 @param[in] groupID セットするグループID値。 @return 以前のグループID値が返ります。 */ u16 SetGroupIDForHeap( Heap heap, u16 groupID); /*! @brief ヒープのグループIDを取得します。 @param[in] heap ヒープのハンドル。 @return グループID値が返ります。 */ u16 GetGroupIDForHeap( Heap heap); /*! @brief ヒープから割り当てられたメモリ全てに対して、 ユーザが指定した関数を呼ばせます。 visitor関数で呼ばれるメモリの順番は、確保した順番になります。 visitor の型 NNSFndHeapVisitor は次のように定義されています。 typedef void (*NNSFndHeapVisitor)( void* memBlock, Heap heap, u32 userParam); memBlock メモリへのポインタ。 heap メモリを含有するヒープ。 userParam ユーザー用パラメータ。 @param[in] heap ヒープのハンドル。 @param[in] visitor 各メモリに対して呼ばせる関数。 @param[in] userParam visitor関数に渡すユーザ指定のパラメータ @return なし。 */ void VisitAllocatedForHeap( Heap heap, NNSFndHeapVisitor visitor, u32 userParam); /*! @brief ヒープから確保されたメモリのサイズを取得します。 @param[in] memBlock サイズを取得するメモリへのポインタ。 @return 指定したメモリのサイズを返します(バイト単位)。 */ u32 GetSizeForMBlockHeap( const void* memBlock); /*! @brief ヒープから確保されたメモリのグループIDを取得します。 @param[in] memBlock グループIDを取得するメモリへのポインタ。 @return 指定したメモリのグループIDが返ります。 */ u16 GetGroupIDForMBlockHeap( const void* memBlock); /*! @brief ヒープから確保されたメモリの確保方向を取得します。 @param[in] memBlock メモリへのポインタ。 @return 指定したメモリの確保方向が返ります。 */ u16 GetAllocDirForMBlockHeap( const void* memBlock); /*! @brief 拡張ヒープの空き領域を解放し、拡張ヒープが使用するメモリ領域を縮小します。 @param[in] heap ヒープのハンドル。 @param[in] mode 縮小する方向を指定します。 @return ヒープが縮小されることにより空いたメモリ領域の範囲を返します。 */ MemoryRange AdjustHeap( Heap heap, HeapAdjustMode mode); /*! @brief アライメントの際に発生する隙間の領域を再利用するかどうかを 設定します。 @param[in] heap ヒープのハンドル。 @param[in] reuse true の場合、アライメントで発生する領域を再利用します。 @return 以前の設定値が返ります。 */ bool UseMarginOfAlignmentForHeap( Heap heap, bool reuse); #if defined(NN_SWITCH_DISABLE_DEBUG_PRINT_FOR_SDK) inline bool CheckHeap(ConstHeap, u32) { return true; } inline bool CheckForMBlockHeap(const void*, ConstHeap, u32) { return true; } #else /*! @brief ヒープが破壊されていないかどうかをチェックします。 @param[in] heap ヒープのハンドル。 @param[in] optFlag フラグ。 @return ヒープが正常だった場合 true を返します。 ヒープにエラーがあった場合、false を返します。 */ bool CheckHeap( ConstHeap heap, u32 optFlag); /*! @brief ヒープのメモリが破壊されていないかどうかをチェックします。 @param[in] memBlock チェックするメモリへのポインタ。 @param[in] heap ヒープのハンドル。 @param[in] optFlag フラグ。 @return メモリが正常だった場合 true を返します。 メモリにエラーがあった場合、false を返します。 */ bool CheckForMBlockHeap( const void* memBlock, ConstHeap heap, u32 optFlag); #endif /*! @} */ /*! @} */ }}} // namespace nn::fnd::detail #endif // __cplusplus /* NN_OS_HEAP_H_ */ #endif