Sander Striker wrote:
From: Brian Pane [mailto:[EMAIL PROTECTED]
Sent: 11 December 2001 18:21
Sander Striker wrote:
From: Brian Pane [ mailto:[EMAIL PROTECTED]
Sent: 10 December 2001 22:36
Sander Striker wrote:
Hi,
This is the code with the latest changes based on comments
from various people.
I have yet to begin to start coding/migrating the debug
code. I won't have time to complete that until at least
next week. Bill (wrowe) can you live without that for
a little while? I specifically ask because you have
recently added a bunch of debug code to pools.
I can try to add in the debug code this week.
Could we sync thoughts on how to do it?
I would very much like to split out the common code between
debug and production into a seperate file, and have both the
debug specific and the production only code in another.
This hopefully keeps the production code clean and readable.
Good point, and now that I've had a chance to study
the debug code some more, I think it will take some
more planning to add it into the new pools code. The
problem is that a lot of the debug code for joining
pools is dependent on having a single free list. Do
you have a design in mind for making the debug code
work with the new allocator system?
I had the idea to not use the allocator system or any of the
production pools code while debugging. The debug code
will just use malloc/free instead. In debug mode speed
isn't important anyway :)
Hmm, we could opt for two versions: let node_malloc
and node_free just do malloc and free, and let apr_palloc
and apr_pool_clear/apr_pool_destroy use malloc/free.
I do realise that this will leave the regular pools code
untouched while debugging, which is the downside to doing
it that way.
What are your thoughts on the matter?
IMHO, it makes sense to have a couple of different versions
of debug functionality, like you've suggested. Here are the
two versions that I think might be useful:
1. Based on the production code, except that the each
apr_palloc'ed block of memory has guard bands before
and after it that are filled with 0x5a (or some other
pattern). The pool code can check for overwrites during
standard pool operations:
- When doing an apr_palloc, check the guard bands of
the last few pieces of memory apr_palloc'ed from that
block, and throw an exception (so to speak) if any
of them have been overwritten. (This requires that
we store some metadata in the guard band to identify
the location of the previous allocation within the block.)
- When clearing a pool, cycle through all the allocations
within each block
Note: If possible, I think it's good for this type of debug
code to be based on the production code (asuming we can
implement it cleanly. My rationale is that, if it's similar
in implementation to the production code, it can be used to
debug corruption problems that involve race conditions (because
the timing and object-adjacency properties of the debug code
will be similar to the production code).
2. The "extreme" version that does a malloc for each apr_palloc.
This is the version for use with Purify, Electric Fence, et al.
(Note: I'm of the opinion that we shouldn't put memprotect
support into the pools code itself, because by doing so we're
just duplicating the work of 3rd-party memory debuggers. Does
anybody have an alternate perspective on this issue?)
--Brian