mirror of
git://git.code.sf.net/p/sbcl/sbcl
synced 2026-09-10 07:26:40 -04:00
Unify some logic in lisp_alloc
Asserting that we didn't overrun the TLAB on this allocation is subsumed by the check for whether to refill the TLAB right away.
This commit is contained in:
parent
3e437d314c
commit
d5600e36f2
|
|
@ -4840,29 +4840,27 @@ lisp_alloc(int largep, struct alloc_region *region, sword_t nbytes,
|
|||
new_obj = gc_alloc_large(nbytes, page_type, region, 1);
|
||||
else {
|
||||
ensure_region_closed(region, page_type);
|
||||
// hold the lock after alloc_new_region if a cons page
|
||||
int release = page_type != PAGE_TYPE_CONS;
|
||||
new_obj = gc_alloc_new_region(nbytes, page_type, region, release);
|
||||
region->free_pointer = (char*)new_obj + nbytes;
|
||||
// addr_diff asserts that 'end' >= 'free_pointer'
|
||||
int remaining = addr_diff(region->end_addr, region->free_pointer);
|
||||
// Try to avoid the next Lisp -> C -> Lisp round-trip by possibly
|
||||
// requesting yet another region.
|
||||
if (page_type == PAGE_TYPE_CONS) {
|
||||
new_obj = gc_alloc_new_region(nbytes, PAGE_TYPE_CONS, region, 0); // don't release free_pages_lock
|
||||
region->free_pointer = (char*)new_obj + nbytes;
|
||||
gc_assert(region->free_pointer <= region->end_addr);
|
||||
// Refill now if there is only 1 cons remaining on the page.
|
||||
// This can often avoid the next Lisp -> C -> Lisp round-trip.
|
||||
if (addr_diff(region->end_addr, region->free_pointer) <= 2 * N_WORD_BYTES) {
|
||||
if (remaining <= CONS_SIZE * N_WORD_BYTES) { // Refill now if <= 1 more cons to go
|
||||
gc_close_region(region, page_type);
|
||||
// Request > 2 words, forcing a new page to be claimed.
|
||||
gc_alloc_new_region(4 * N_WORD_BYTES, page_type, region, 0); // don't release
|
||||
}
|
||||
ret = mutex_release(&free_pages_lock);
|
||||
gc_assert(ret);
|
||||
} else {
|
||||
new_obj = gc_alloc_new_region(nbytes, page_type, region, 1); // do release free_pages_lock
|
||||
region->free_pointer = (char*)new_obj + nbytes;
|
||||
gc_assert(region->free_pointer <= region->end_addr);
|
||||
if (addr_diff(region->end_addr, region->free_pointer) <= 4 * N_WORD_BYTES
|
||||
&& TryEnterCriticalSection(&free_pages_lock)) {
|
||||
gc_close_region(region, page_type);
|
||||
// Request > 4 words, forcing a new page to be claimed.
|
||||
gc_alloc_new_region(6 * N_WORD_BYTES, page_type, region, 1); // do release
|
||||
}
|
||||
} else if (remaining <= 4 * N_WORD_BYTES
|
||||
&& TryEnterCriticalSection(&free_pages_lock)) {
|
||||
gc_close_region(region, page_type);
|
||||
// Request > 4 words, forcing a new page to be claimed.
|
||||
gc_alloc_new_region(6 * N_WORD_BYTES, page_type, region, 1); // do release
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue