| 463 | } |
| 464 | |
| 465 | static void __omDebugFree(void* addr, void* size_bin, omTrackFlags_t flags, OM_FLR_DECL) |
| 466 | { |
| 467 | omBin bin = NULL; |
| 468 | |
| 469 | if (addr == NULL || ((flags & OM_FSIZE) && size_bin == NULL)) return; |
| 470 | if (om_Opts.Keep > 0) |
| 471 | { |
| 472 | #ifdef OM_HAVE_TRACK |
| 473 | if (omIsTrackAddr(addr)) |
| 474 | addr = omMarkAsFreeTrackAddr(addr, 1, &flags, OM_FLR_VAL); |
| 475 | #endif |
| 476 | bin = omGetOrigSpecBinOfAddr(addr); |
| 477 | if (bin != NULL) |
| 478 | { |
| 479 | omSpecBin s_bin = omFindInGList(om_SpecBin, next, bin, (unsigned long) bin); |
| 480 | omAssume(s_bin != NULL); |
| 481 | (s_bin->ref)++; |
| 482 | } |
| 483 | |
| 484 | if (flags & OM_FKEEP) |
| 485 | { |
| 486 | *((void**) addr) = om_AlwaysKeptAddrs; |
| 487 | om_AlwaysKeptAddrs = addr; |
| 488 | return; |
| 489 | } |
| 490 | |
| 491 | if (om_NumberOfKeptAddrs) |
| 492 | { |
| 493 | omAssume(om_KeptAddr != NULL && om_LastKeptAddr != NULL && |
| 494 | ((om_NumberOfKeptAddrs == 1 && om_LastKeptAddr == om_KeptAddr) || |
| 495 | (om_NumberOfKeptAddrs != 1 && om_LastKeptAddr != om_KeptAddr))); |
| 496 | om_NumberOfKeptAddrs++; |
| 497 | *((void**) om_LastKeptAddr) = addr; |
| 498 | om_LastKeptAddr = addr; |
| 499 | *((void**) addr) = NULL; |
| 500 | } |
| 501 | else |
| 502 | { |
| 503 | om_NumberOfKeptAddrs = 1; |
| 504 | om_LastKeptAddr = addr; |
| 505 | om_KeptAddr = addr; |
| 506 | *((void**) om_LastKeptAddr) = NULL; |
| 507 | } |
| 508 | |
| 509 | if (om_NumberOfKeptAddrs > om_Opts.Keep) |
| 510 | { |
| 511 | omError_t status = omDoCheckAddr(om_KeptAddr, NULL, OM_FKEPT, om_Opts.MinCheck, |
| 512 | omError_MemoryCorrupted, OM_FLR_VAL); |
| 513 | addr = om_KeptAddr; |
| 514 | if (addr!=NULL) om_KeptAddr = *((void**) addr); |
| 515 | om_NumberOfKeptAddrs--; |
| 516 | if (status != omError_NoError) return; |
| 517 | } |
| 518 | else |
| 519 | return; |
| 520 | |
| 521 | bin = omGetOrigSpecBinOfAddr(addr); |
| 522 | } |
no test coverage detected