MCPcopy Create free account
hub / github.com/doldecomp/mkdd / allocFromHead

Method allocFromHead

libs/JSystem/JKernel/JKRExpHeap.cpp:154–261  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

152static JKRExpHeap::CMemBlock *DBnewUsedBlock;
153
154void *JKRExpHeap::allocFromHead(u32 size, int align)
155{
156 // TODO: cleaner declares(if possible)
157 u32 foundOffset;
158 int foundSize;
159 CMemBlock *newFreeBlock;
160 CMemBlock *newUsedBlock;
161 CMemBlock *foundBlock;
162
163 size = ALIGN_NEXT(size, 4);
164 foundSize = -1;
165 foundOffset = 0;
166 foundBlock = nullptr;
167
168 for (CMemBlock *block = mHead; block; block = block->mNext)
169 {
170 u32 offset = ALIGN_PREV(align - 1 + (u32)block->getContent(), align) - (u32)block->getContent();
171 if (block->mAllocatedSpace < size + offset)
172 {
173 continue;
174 }
175 if (foundSize <= (u32)block->mAllocatedSpace)
176 {
177 continue;
178 }
179 foundSize = block->mAllocatedSpace;
180 foundBlock = block;
181 foundOffset = offset;
182 if (mCurrentAllocMode != 0)
183 {
184 break;
185 }
186 u32 blockSize = block->mAllocatedSpace;
187 if (blockSize == size)
188 {
189 break;
190 }
191 }
192 DBfoundSize = foundSize;
193 DBfoundOffset = foundOffset;
194 DBfoundBlock = foundBlock;
195 if (foundBlock)
196 {
197 if (foundOffset >= sizeof(CMemBlock))
198 {
199 CMemBlock *prev = foundBlock->mPrev;
200 CMemBlock *next = foundBlock->mNext;
201 newUsedBlock = foundBlock->allocFore(foundOffset - sizeof(CMemBlock), 0, 0, 0, 0);
202
203 if (newUsedBlock)
204 {
205 newFreeBlock = newUsedBlock->allocFore(size, mCurrentGroupID, 0, 0, 0);
206 }
207 else
208 {
209 newFreeBlock = nullptr;
210 }
211 if (newFreeBlock)

Callers

nothing calls this directly

Calls 2

getContentMethod · 0.80
allocForeMethod · 0.80

Tested by

no test coverage detected