L < arena->mu, L < arena->arena->mu
| 312 | |
| 313 | // L < arena->mu, L < arena->arena->mu |
| 314 | bool LowLevelAlloc::DeleteArena(Arena *arena) { |
| 315 | RAW_CHECK(arena != 0 && arena != &default_arena && arena != &unhooked_arena, |
| 316 | "may not delete default arena"); |
| 317 | ArenaLock section(arena); |
| 318 | bool empty = (arena->allocation_count == 0); |
| 319 | section.Leave(); |
| 320 | if (empty) { |
| 321 | while (arena->freelist.next[0] != 0) { |
| 322 | AllocList *region = arena->freelist.next[0]; |
| 323 | size_t size = region->header.size; |
| 324 | arena->freelist.next[0] = region->next[0]; |
| 325 | RAW_CHECK(region->header.magic == |
| 326 | Magic(kMagicUnallocated, ®ion->header), |
| 327 | "bad magic number in DeleteArena()"); |
| 328 | RAW_CHECK(region->header.arena == arena, |
| 329 | "bad arena pointer in DeleteArena()"); |
| 330 | RAW_CHECK(size % arena->pagesize == 0, |
| 331 | "empty arena has non-page-aligned block size"); |
| 332 | RAW_CHECK(reinterpret_cast<intptr_t>(region) % arena->pagesize == 0, |
| 333 | "empty arena has non-page-aligned block"); |
| 334 | int munmap_result; |
| 335 | if ((arena->flags & LowLevelAlloc::kAsyncSignalSafe) == 0) { |
| 336 | munmap_result = munmap(region, size); |
| 337 | } else { |
| 338 | munmap_result = MallocHook::UnhookedMUnmap(region, size); |
| 339 | } |
| 340 | RAW_CHECK(munmap_result == 0, |
| 341 | "LowLevelAlloc::DeleteArena: munmap failed address"); |
| 342 | } |
| 343 | Free(arena); |
| 344 | } |
| 345 | return empty; |
| 346 | } |
| 347 | |
| 348 | // --------------------------------------------------------------------------- |
| 349 |