Update TODO with mention of the CONFIG->ENABLE migration and ruminations
about FEATURE_CLEAN_UP.
This commit is contained in:
parent
af0dd596a8
commit
a882126fee
67
TODO
67
TODO
@ -109,9 +109,74 @@ Memory Allocation
|
|||||||
allocation on the stack or the heap. Unfortunately, we're not using it much.
|
allocation on the stack or the heap. Unfortunately, we're not using it much.
|
||||||
We need to audit our memory allocations and turn a lot of malloc/free calls
|
We need to audit our memory allocations and turn a lot of malloc/free calls
|
||||||
into RESERVE_CONFIG_BUFFER/RELEASE_CONFIG_BUFFER.
|
into RESERVE_CONFIG_BUFFER/RELEASE_CONFIG_BUFFER.
|
||||||
|
|
||||||
And while we're at it, many of the CONFIG_FEATURE_CLEAN_UP #ifdefs will be
|
And while we're at it, many of the CONFIG_FEATURE_CLEAN_UP #ifdefs will be
|
||||||
optimized out by the compiler in the stack allocation case (since there's no
|
optimized out by the compiler in the stack allocation case (since there's no
|
||||||
free for an alloca()), and this means that various cleanup loops that just
|
free for an alloca()), and this means that various cleanup loops that just
|
||||||
call free might also be optimized out by the compiler if written right, so
|
call free might also be optimized out by the compiler if written right, so
|
||||||
we can yank those #ifdefs too, and generally clean up the code.
|
we can yank those #ifdefs too, and generally clean up the code.
|
||||||
|
---
|
||||||
|
Switch CONFIG_SYMBOLS to ENABLE_SYMBOLS
|
||||||
|
|
||||||
|
In busybox 1.0 and earlier, configuration was done by CONFIG_SYMBOLS
|
||||||
|
that were either defined or undefined to indicate whether the symbol was
|
||||||
|
selected in the .config file. They were used with #ifdefs, ala:
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYMBOL
|
||||||
|
if (other_test) {
|
||||||
|
do_code();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
In 1.1, we have new ENABLE_SYMBOLS which are always defined (as 0 or 1),
|
||||||
|
meaning you can still use them for preprocessor tests by replacing
|
||||||
|
"#ifdef CONFIG_SYMBOL" with "#if ENABLE_SYMBOL". But more importantly, we
|
||||||
|
can use them as a true or false test in normal C code:
|
||||||
|
|
||||||
|
if (ENABLE_SYMBOL && other_test) {
|
||||||
|
do_code();
|
||||||
|
}
|
||||||
|
|
||||||
|
(Optimizing away if() statements that resolve to a constant value
|
||||||
|
is known as "dead code elimination", an optimization so old and simple that
|
||||||
|
Turbo Pascal for DOS did it twenty years ago. Even modern mini-compilers
|
||||||
|
like the Tiny C Compiler (tcc) and the Small Device C Compiler (SDCC)
|
||||||
|
perform dead code elimination.)
|
||||||
|
|
||||||
|
Right now, busybox.h is #including both "config.h" (defining the
|
||||||
|
CONFIG_SYMBOLS) and "bb_config.h" (defining the ENABLE_SYMBOLS). At some
|
||||||
|
point in the future, it would be nice to wean ourselves off of the
|
||||||
|
CONFIG versions. (Among other things, some defective build environments
|
||||||
|
leak the Linux kernel's CONFIG_SYMBOLS into the system's standard #include
|
||||||
|
files. We've experienced collisions before.)
|
||||||
|
---
|
||||||
|
FEATURE_CLEAN_UP
|
||||||
|
This is more an unresolved issue than a to-do item. More thought is needed.
|
||||||
|
|
||||||
|
Normally we rely on exit() to free memory, close files, and unmap segments
|
||||||
|
for us. This makes most calls to free(), close(), and unmap() optional in
|
||||||
|
busybox applets that don't intend to run for very long, and optional stuff
|
||||||
|
can be omitted to save size.
|
||||||
|
|
||||||
|
The idea was raised that we could simulate fork/exit with setjmp/longjmp
|
||||||
|
for _really_ brainless embedded systems, or speed up the standalone shell
|
||||||
|
by not forking. Doing so would require a reliable FEATURE_CLEAN_UP.
|
||||||
|
Unfortunately, this isn't as easy as it sounds.
|
||||||
|
|
||||||
|
The problem is, lots of things exit(), sometimes unexpectedly (xmalloc())
|
||||||
|
and sometimes reliably (bb_perror_msg_and_die() or show_usage()). This
|
||||||
|
jumps out of the normal flow control and bypasses any cleanup code we
|
||||||
|
put at the end of our applets.
|
||||||
|
|
||||||
|
It's possible to add hooks to libbb functions like xmalloc() and bb_xopen()
|
||||||
|
to add their entries to a linked list, which could be traversed and
|
||||||
|
freed/closed automatically. (This would need to be able to free just the
|
||||||
|
entries after a checkpoint to be usable for a forkless standalone shell.
|
||||||
|
You don't want to free the shell's own resources.)
|
||||||
|
|
||||||
|
Right now, FEATURE_CLEAN_UP is more or less a debugging aid, to make things
|
||||||
|
like valgrind happy. It's also documentation of _what_ we're trusting
|
||||||
|
exit() to clean up for us. But new infrastructure to auto-free stuff would
|
||||||
|
render the existing FEATURE_CLEAN_UP code redundant.
|
||||||
|
|
||||||
|
For right now, exit() handles it just fine.
|
||||||
|
Loading…
Reference in New Issue
Block a user