@@ -204,23 +204,24 @@ struct SceKernelVplHeader {
204
204
205
205
u32 Allocate (u32 size) {
206
206
u32 allocBlocks = ((size + 7 ) / 8 ) + 1 ;
207
- auto prev = PSPPointer<SceKernelVplBlock>::Create (0 );
208
- auto b = nextFreeBlock_;
207
+ auto prev = nextFreeBlock_;
209
208
do {
209
+ auto b = prev->next ;
210
210
if (b->sizeInBlocks > allocBlocks) {
211
+ if (nextFreeBlock_ == b) {
212
+ nextFreeBlock_ = prev;
213
+ }
211
214
prev = b;
212
215
b = SplitBlock (b, allocBlocks);
213
216
}
214
217
215
218
if (b->sizeInBlocks == allocBlocks) {
216
219
UnlinkFreeBlock (b, prev);
217
- _dbg_assert_msg_ (SCEKERNEL, b->sizeInBlocks == allocBlocks, " Returned block of improper size." );
218
220
return b.ptr + 8 ;
219
221
}
220
222
221
223
prev = b;
222
- b = b->next ;
223
- } while (b.IsValid () && b != nextFreeBlock_);
224
+ } while (prev.IsValid () && prev != nextFreeBlock_);
224
225
225
226
return (u32 )-1 ;
226
227
}
@@ -281,21 +282,11 @@ struct SceKernelVplHeader {
281
282
}
282
283
283
284
void UnlinkFreeBlock (PSPPointer<SceKernelVplBlock> b, PSPPointer<SceKernelVplBlock> prev) {
284
- // If this was the first we tried, we have to search for prev.
285
- if (!prev.IsValid ()) {
286
- prev = LastBlock ();
287
- while (prev->next != b) {
288
- prev = prev->next ;
289
- if (prev == LastBlock ()) {
290
- _dbg_assert_msg_ (SCEKERNEL, prev != LastBlock (), " Should have found a previous free block." );
291
- break ;
292
- }
293
- }
294
- }
295
-
296
285
allocatedInBlocks_ += b->sizeInBlocks ;
297
286
prev->next = b->next ;
298
- nextFreeBlock_ = b->next ;
287
+ if (nextFreeBlock_ == b) {
288
+ nextFreeBlock_ = prev;
289
+ }
299
290
b->next = SentinelPtr ();
300
291
}
301
292
0 commit comments