On Thu, Sep 20, 2001 at 05:48:45PM -0700, Greg Stein wrote: > On Thu, Sep 20, 2001 at 11:18:55AM -0700, Aaron Bannert wrote: > >... > > Does this fix it for you? All testmem tests passed for me and your code > > above properly flushes "Cleanup" to the file. > > > > (Someone needs to check my work on run_child_cleanups() and make sure > > that the popping is necessary. It looked to be in the same situation.) > > Calling pop_cleanup() on every iteration is a bit much. Consider the > following patch:
The reason I went that route, instead of just inlining the pop_cleanup() code is that it gets called in two places. If it is a performance issue, I'd just put it all inside the while loop in run_cleanups(). Would that be preferable? > > while ((c = p->cleanups) != NULL) { > p->cleanups = NULL; > run_cleanups(c); > } > > You don't even have to change run_cleanups or run_child_cleanups. Wouldn't that go in run_cleanups(), or does this go in apr_pool_clear()? > Basically, the above code processes the cleanups in batches. Everything that > was initially registered is processed, then everything registerd during the > first cleanup round, etc. That does encourage deeper recursion, would this be a potential problem for OSs like Netware that have a rather small and limited stack size? I don't really know how much the pool_clear() routines consume stack space. > It does not maintain the LIFO behavior where cleanup A registers cleanup B > and expects B to run *just after* cleanup A finishes. If A wanted that, then > it could just calll B. But the most important part: all cleanups *do* get > run. Correct me if I'm wrong, it is a LIFO and what Ryan wants is a FIFO. LIFO == cleanup registers a cleanup, it gets run after the cleanups FIFO == cleanup registers a cleanup, it gets run as soon as this one returns Am I missing something? -aaron