[WIP] bpo-31626: Rewrite _PyMem_DebugRawRealloc()#3898
Closed
vstinner wants to merge 1 commit intopython:masterfrom
vstinner:realloc_debug
Closed
[WIP] bpo-31626: Rewrite _PyMem_DebugRawRealloc()#3898vstinner wants to merge 1 commit intopython:masterfrom vstinner:realloc_debug
vstinner wants to merge 1 commit intopython:masterfrom
vstinner:realloc_debug
Conversation
Previously, _PyMem_DebugRawRealloc() expected that the old memory block remains readable and unchanged after realloc(). This assumption is wrong on OpenBSD. Rewrite _PyMem_DebugRawRealloc() as malloc()+free() rather than realloc(). Debug hooks are reused. The old memory block remains valid after the new memory block was allocated, so bytes can be safely copied in a portable way. The drawback is that _PyMem_DebugRawRealloc() now allocates a new memory block while the old memory block remains allocated, until the old memory block is freed, so the peak memory usage can be the double in the worst case. The second drawback is that the system realloc() is no more used in debug mode.
Member
Author
|
I tagged the PR as WIP because I dislike the second drawback of my change: "the system realloc() is no more used in debug mode". A bug in system realloc() would be missed completely in debug mode with this change. |
Member
|
I'm opposed to this change. The purpose of the debug allocator is to help with finding bugs in user code. But if realloc() always returns a new reference, this can hide bugs. Some bugs now could be reproduced only with non-debug allocator. |
Member
Author
|
PR #3844 was merged, I abandon my change. @serhiy-storchaka also wrote a lighter version of my PR without allocating memory on the heap: allocate memory on the stack instead, PR #4210. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Previously, _PyMem_DebugRawRealloc() expected that the old memory
block remains readable and unchanged after realloc(). This assumption
is wrong on OpenBSD.
Rewrite _PyMem_DebugRawRealloc() as malloc()+free() rather than
realloc(). Debug hooks are reused. The old memory block remains valid
after the new memory block was allocated, so bytes can be safely
copied in a portable way.
The drawback is that _PyMem_DebugRawRealloc() now allocates a new
memory block while the old memory block remains allocated, until the
old memory block is freed, so the peak memory usage can be the double
in the worst case.
The second drawback is that the system realloc() is no more used in
debug mode.
https://bugs.python.org/issue31626