rec->size = (n+1)*MBLOCK_SIZE;
rec->base =
VirtualAlloc(NULL, rec->size, MEM_RESERVE, PAGE_READWRITE);
if(rec->base==0) {
rec->size = (n+1)*MBLOCK_SIZE;
rec->base =
VirtualAlloc(NULL, rec->size, MEM_RESERVE, PAGE_READWRITE);
if(rec->base==0) {
if(prev->base + prev->size == alloc_base) { /* Merge it, alloc, prev */
prev->size += alloc_size + it->size;
prev->next = it->next;
if(prev->base + prev->size == alloc_base) { /* Merge it, alloc, prev */
prev->size += alloc_size + it->size;
prev->next = it->next;
} else if(prev->base + prev->size == alloc_base) { /* Merge alloc, prev */
prev->size += alloc_size;
} else { /* Merge none */
} else if(prev->base + prev->size == alloc_base) { /* Merge alloc, prev */
prev->size += alloc_size;
} else { /* Merge none */
} else {
it->base += required_size;
it->size -=required_size;
}
} else {
char* need_base = (char*)(((unsigned long)it->base) & ((unsigned long)~MBLOCK_MASK)) + MBLOCK_SIZE;
} else {
it->base += required_size;
it->size -=required_size;
}
} else {
char* need_base = (char*)(((unsigned long)it->base) & ((unsigned long)~MBLOCK_MASK)) + MBLOCK_SIZE;
- block_rec* next = (block_rec*)malloc(sizeof(block_rec));
- /* TODO: Check malloc failure */
+ block_rec* next
+ = (block_rec*)stgMallocBytes(
+ sizeof(block_rec)
+ , "getMBlocks: findFreeBlocks: splitting");
int new_size = need_base - it->base;
next->base = need_base +required_size;
next->size = it->size - (new_size+required_size);
int new_size = need_base - it->base;
next->base = need_base +required_size;
next->size = it->size - (new_size+required_size);
if(!VirtualFree((void*)it->base, 0, MEM_RELEASE))
debugBelch("freeAllMBlocks: VirtualFree MEM_RELEASE failed with %ld", GetLastError());
next = it->next;
if(!VirtualFree((void*)it->base, 0, MEM_RELEASE))
debugBelch("freeAllMBlocks: VirtualFree MEM_RELEASE failed with %ld", GetLastError());
next = it->next;