/*---------------------------------------------------------------------------* Project: Horizon File: os_AddressSpaceManager.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: 17610 $ *---------------------------------------------------------------------------*/ #ifndef NN_OS_OS_ADDRESSSPACEMANAGER_H_ #define NN_OS_OS_ADDRESSSPACEMANAGER_H_ #include #if NN_PLATFORM_HAS_MMU #include #include #include // CHECK: C++ 用 ifdef が必要ではないでしょうか? //#ifdef __cplusplus namespace nn { namespace os { /*! @brief アドレス空間マネージャ */ class AddressSpaceManager { private: typedef fnd::IntrusiveLinkedList BlockList; typedef os::CriticalSection Lock; private: uptr m_SpaceBegin; //!< アドレス空間の開始アドレス uptr m_SpaceEnd; //!< アドレス空間の終端アドレス BlockList m_BlockList; //!< メモリブロックリスト Lock m_Lock; //!< 同期オブジェクト public: // CHECK: コンストラクタにて m_SpaceBegin、m_SpaceEnd を初期化することを推奨します。 /*! @brief アドレス空間マネージャにメモリ領域を割り当てます。 @param[in] begin メモリ領域の開始アドレス @param[in] size メモリ領域のサイズ */ void Initialize(uptr begin, size_t size); /*! @brief アドレス空間からメモリを確保します。 @param[out] pBlock メモリを割り当てるブロック @param[in] size 確保するメモリのサイズ。ページサイズにアライメントされている必要があります。 @return 確保したメモリのアドレスを返します。 */ uptr Allocate(MemoryBlockBase* pBlock, size_t size, size_t skipSize); /*! @brief メモリブロックをアドレス空間に解放します。 @param[in] pBlock メモリブロック */ void Free(MemoryBlockBase* pBlock); /*! @brief メモリブロックの情報を pFrom から pTo に移します。 @param[out] pTo メモリブロックをコピーする対象 @param[in,out] pFrom メモリブロック情報をコピーする元。コピー後はメモリブロックはクリアされます。 */ void Switch(MemoryBlockBase* pTo, MemoryBlockBase* pFrom); /*! @brief アドレス空間に存在するメモリブロックリストをデバッグ出力します。 */ void Dump(); private: /*! :private @brief 指定したサイズ+ページサイズ分の空きがある領域を探索します。 @param[in] size 探索するサイズ @return メモリブロックの後ろに空きがあった場合は、そのメモリブロックへのポインタを返します。 全空間が空いている、先頭の空間が空いている場合には NULL を返します。 サイズ分の空きを確保できる領域がなかった場合にも NULL を返します。 */ MemoryBlockBase* FindSpace(size_t size, size_t skipSize); }; } } // CHECK: C++ 用 ifdef が必要ではないでしょうか? //#endif // __cplusplus #include /*! @addtogroup nn_os os @{ @defgroup nn_os_AddressSpaceManager_c AddressSpaceManager (C) @brief @ref nn::os::AddressSpaceManager の C インタフェースモジュールです。 @{ */ /*! @struct nnosAddressSpaceManager @brief アドレス空間管理を表す C の構造体です。 @brief 対応するクラス @ref nn::os::AddressSpaceManager を参照してください。 */ NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosAddressSpaceManager, nn::os::AddressSpaceManager, 24, bit32); /*! @brief 対応する C++ 関数 @ref nn::os::AddressSpaceManager::Initialize を参照してください。 */ NN_EXTERN_C void nnosAddressSpaceManagerInitialize(nnosAddressSpaceManager* p, uptr begin, size_t size); /*! @brief 対応する C++ 関数 @ref nn::os::AddressSpaceManager::Allocate を参照してください。 */ NN_EXTERN_C uptr nnosAddressSpaceManagerAllocate(nnosAddressSpaceManager* p, nnosMemoryBlockBase* pBlock, size_t size, size_t skipSize); /*! @brief 対応する C++ 関数 @ref nn::os::AddressSpaceManager::Free を参照してください。 */ NN_EXTERN_C void nnosAddressSpaceManagerFree(nnosAddressSpaceManager* p, nnosMemoryBlockBase* pBlock); /*! @brief 対応する C++ 関数 @ref nn::os::AddressSpaceManager::Switch を参照してください。 */ NN_EXTERN_C void nnosAddressSpaceManagerSwitch(nnosAddressSpaceManager* p, nnosMemoryBlockBase* pTo, nnosMemoryBlockBase* pFrom); /*! @} @} */ #endif // if NN_PLATFORM_HAS_MMU #endif /* NN_OS_OS_ADDRESSSPACEMANAGER_H_ */