| 540 | } |
| 541 | |
| 542 | void omFreeKeptAddrFromBin(omBin bin) |
| 543 | { |
| 544 | void* addr = om_KeptAddr; |
| 545 | void* prev_addr = NULL; |
| 546 | void* next_addr; |
| 547 | omTrackFlags_t flags; |
| 548 | |
| 549 | while (addr != NULL) |
| 550 | { |
| 551 | next_addr = *((void**) addr); |
| 552 | if (omIsBinPageAddr(addr) && omGetTopBinOfAddr(addr) == bin) |
| 553 | { |
| 554 | if (prev_addr != NULL) |
| 555 | *((void**) prev_addr) = next_addr; |
| 556 | else |
| 557 | om_KeptAddr = next_addr; |
| 558 | if (addr == om_LastKeptAddr) |
| 559 | om_LastKeptAddr = prev_addr; |
| 560 | om_NumberOfKeptAddrs--; |
| 561 | #ifdef OM_HAVE_TRACK |
| 562 | if (omIsTrackAddr(addr)) |
| 563 | { |
| 564 | omMarkAsFreeTrackAddr(addr, 0, &flags, OM_FLR); |
| 565 | omFreeTrackAddr(addr); |
| 566 | } |
| 567 | else |
| 568 | #endif |
| 569 | __omFree(addr); |
| 570 | addr = next_addr; |
| 571 | } |
| 572 | else |
| 573 | { |
| 574 | prev_addr = addr; |
| 575 | addr = next_addr; |
| 576 | } |
| 577 | } |
| 578 | |
| 579 | addr = om_AlwaysKeptAddrs; |
| 580 | prev_addr = NULL; |
| 581 | while (addr != NULL) |
| 582 | { |
| 583 | next_addr = *((void**) addr); |
| 584 | if (omIsBinPageAddr(addr) && omGetTopBinOfAddr(addr) == bin) |
| 585 | { |
| 586 | if (prev_addr != NULL) |
| 587 | *((void**) prev_addr) = next_addr; |
| 588 | else |
| 589 | om_AlwaysKeptAddrs = next_addr; |
| 590 | #ifdef OM_HAVE_TRACK |
| 591 | if (omIsTrackAddr(addr)) |
| 592 | { |
| 593 | omMarkAsFreeTrackAddr(addr, 0, &flags, OM_FLR); |
| 594 | omFreeTrackAddr(addr); |
| 595 | } |
| 596 | else |
| 597 | #endif |
| 598 | __omFree(addr); |
| 599 | addr = next_addr; |
no test coverage detected