1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_AddressSpaceManager.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: 17610 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_OS_OS_ADDRESSSPACEMANAGER_H_
17 #define NN_OS_OS_ADDRESSSPACEMANAGER_H_
18 
19 #include <nn/config.h>
20 #if NN_PLATFORM_HAS_MMU
21 
22 #include <nn/types.h>
23 #include <nn/os/os_MemoryBlockBase.h>
24 #include <nn/os/os_CriticalSection.h>
25 
26 // CHECK: C++ �p ifdef ���K�v�ł͂Ȃ��ł��傤��?
27 //#ifdef __cplusplus
28 
29 namespace nn {
30     namespace os {
31 
32         /*!
33             @brief �A�h���X��ԃ}�l�[�W��
34 
35 
36         */
37         class AddressSpaceManager
38         {
39         private:
40             typedef fnd::IntrusiveLinkedList<MemoryBlockBase>   BlockList;
41             typedef os::CriticalSection                         Lock;
42 
43         private:
44             uptr        m_SpaceBegin;    //!< �A�h���X��Ԃ̊J�n�A�h���X
45             uptr        m_SpaceEnd;      //!< �A�h���X��Ԃ̏I�[�A�h���X
46             BlockList   m_BlockList;     //!< �������u���b�N���X�g
47             Lock        m_Lock;          //!< �����I�u�W�F�N�g
48 
49         public:
50             // CHECK: �R���X�g���N�^�ɂ� m_SpaceBegin�Am_SpaceEnd �����������邱�Ƃ������܂��B
51 
52             /*!
53                 @brief �A�h���X��ԃ}�l�[�W���Ƀ������̈�����蓖�Ă܂��B
54 
55                 @param[in] begin �������̈�̊J�n�A�h���X
56                 @param[in] size �������̈�̃T�C�Y
57             */
58             void        Initialize(uptr begin, size_t size);
59 
60             /*!
61                 @brief �A�h���X��Ԃ��烁�������m�ۂ��܂��B
62 
63                 @param[out] pBlock �����������蓖�Ă�u���b�N
64                 @param[in] size �m�ۂ��郁�����̃T�C�Y�B�y�[�W�T�C�Y�ɃA���C�����g����Ă���K�v������܂��B
65 
66                 @return �m�ۂ����������̃A�h���X��Ԃ��܂��B
67             */
68             uptr        Allocate(MemoryBlockBase* pBlock, size_t size, size_t skipSize);
69 
70             /*!
71                 @brief �������u���b�N���A�h���X��Ԃɉ�����܂��B
72 
73                 @param[in] pBlock �������u���b�N
74             */
75             void        Free(MemoryBlockBase* pBlock);
76 
77             /*!
78                 @brief �������u���b�N�̏��� pFrom ���� pTo �Ɉڂ��܂��B
79 
80                 @param[out] pTo �������u���b�N���R�s�[����Ώ�
81                 @param[in,out] pFrom �������u���b�N�����R�s�[���錳�B�R�s�[��̓������u���b�N�̓N���A����܂��B
82             */
83             void        Switch(MemoryBlockBase* pTo, MemoryBlockBase* pFrom);
84 
85             /*!
86                 @brief �A�h���X��Ԃɑ��݂��郁�����u���b�N���X�g���f�o�b�O�o�͂��܂��B
87             */
88             void        Dump();
89 
90         private:
91             /*!
92                 :private
93 
94                 @brief �w�肵���T�C�Y+�y�[�W�T�C�Y���̋�������̈��T�����܂��B
95 
96                 @param[in] size �T������T�C�Y
97 
98                 @return �������u���b�N�̌��ɋ����������ꍇ�́A���̃������u���b�N�ւ̃|�C���^��Ԃ��܂��B
99 
100                         �S��Ԃ����Ă���A�擪�̋�Ԃ����Ă���ꍇ�ɂ� NULL ��Ԃ��܂��B
101 
102                         �T�C�Y���̋����m�ۂł���̈悪�Ȃ������ꍇ�ɂ� NULL ��Ԃ��܂��B
103             */
104             MemoryBlockBase* FindSpace(size_t size, size_t skipSize);
105         };
106 
107 
108     }
109 }
110 
111 // CHECK: C++ �p ifdef ���K�v�ł͂Ȃ��ł��傤��?
112 //#endif // __cplusplus
113 
114 #include <nn/util/detail/util_CLibImpl.h>
115 
116 /*!
117   @addtogroup   nn_os               os
118   @{
119 
120   @defgroup     nn_os_AddressSpaceManager_c       AddressSpaceManager (C)
121 
122   @brief        @ref nn::os::AddressSpaceManager �� C �C���^�t�F�[�X���W���[���ł��B
123 
124   @{
125 */
126 
127 /*!
128   @struct       nnosAddressSpaceManager
129   @brief        �A�h���X��ԊǗ���\�� C �̍\���̂ł��B
130 
131   @brief �Ή�����N���X @ref nn::os::AddressSpaceManager ���Q�Ƃ��Ă��������B
132 */
133 
134 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosAddressSpaceManager, nn::os::AddressSpaceManager, 24, bit32);
135 
136 /*!
137   @brief �Ή����� C++ �֐� @ref nn::os::AddressSpaceManager::Initialize ���Q�Ƃ��Ă��������B
138 */
139 NN_EXTERN_C void nnosAddressSpaceManagerInitialize(nnosAddressSpaceManager* p, uptr begin, size_t size);
140 
141 /*!
142   @brief �Ή����� C++ �֐� @ref nn::os::AddressSpaceManager::Allocate ���Q�Ƃ��Ă��������B
143 */
144 NN_EXTERN_C uptr nnosAddressSpaceManagerAllocate(nnosAddressSpaceManager* p, nnosMemoryBlockBase* pBlock, size_t size, size_t skipSize);
145 
146 /*!
147   @brief �Ή����� C++ �֐� @ref nn::os::AddressSpaceManager::Free ���Q�Ƃ��Ă��������B
148 */
149 NN_EXTERN_C void nnosAddressSpaceManagerFree(nnosAddressSpaceManager* p, nnosMemoryBlockBase* pBlock);
150 
151 /*!
152   @brief �Ή����� C++ �֐� @ref nn::os::AddressSpaceManager::Switch ���Q�Ƃ��Ă��������B
153 */
154 NN_EXTERN_C void nnosAddressSpaceManagerSwitch(nnosAddressSpaceManager* p, nnosMemoryBlockBase* pTo, nnosMemoryBlockBase* pFrom);
155 
156 /*!
157   @}
158 
159   @}
160 */
161 
162 #endif  // if NN_PLATFORM_HAS_MMU
163 #endif /* NN_OS_OS_ADDRESSSPACEMANAGER_H_ */
164