Commit Larry Doolittle's buffers-on-stack/buffers-via-malloc patch.

-Erik
This commit is contained in:
Eric Andersen 2001-01-25 23:49:09 +00:00
parent ffde8673fe
commit d35c21587a
12 changed files with 51 additions and 28 deletions

View File

@ -129,6 +129,11 @@
// pretty/useful). // pretty/useful).
// //
// //
// BusyBox will, by default, malloc space for its buffers. This costs code
// size for the call to xmalloc. You can use the following feature to have
// them put on the stack. For some very small machines with limited stack
// space, this can be deadly. For most folks, this works just fine...
//#define BB_FEATURE_BUFFERS_GO_ON_STACK
// //
// Turn this on to use Erik's very cool devps, and devmtab kernel drivers, // Turn this on to use Erik's very cool devps, and devmtab kernel drivers,
// thereby eliminating the need for the /proc filesystem and thereby saving // thereby eliminating the need for the /proc filesystem and thereby saving

View File

@ -1222,8 +1222,8 @@ int gunzip_main(int argc, char **argv)
int force = 0; int force = 0;
struct stat statBuf; struct stat statBuf;
char *delFileName; char *delFileName;
char ifname[MAX_PATH_LEN + 1]; /* input file name */ RESERVE_BB_BUFFER(ifname, MAX_PATH_LEN+1); /* input file name */
char ofname[MAX_PATH_LEN + 1]; /* output file name */ RESERVE_BB_BUFFER(ofname, MAX_PATH_LEN+1); /* output file name */
method = DEFLATED; /* default compression method */ method = DEFLATED; /* default compression method */
exit_code = OK; /* let's go out on a limb and assume everything will run fine (wink wink) */ exit_code = OK; /* let's go out on a limb and assume everything will run fine (wink wink) */

View File

@ -266,4 +266,12 @@ char *format(unsigned long val, unsigned long hr);
#define GIGABYTE (MEGABYTE*1024) #define GIGABYTE (MEGABYTE*1024)
#endif #endif
#ifdef BB_FEATURE_BUFFERS_GO_ON_STACK
#define RESERVE_BB_BUFFER(buffer,len) char buffer[len]
#define RESERVE_BB_UBUFFER(buffer,len) unsigned char buffer[len]
#else
#define RESERVE_BB_BUFFER(buffer,len) char *buffer=xmalloc(len)
#define RESERVE_BB_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len)
#endif
#endif /* _BB_INTERNAL_H_ */ #endif /* _BB_INTERNAL_H_ */

View File

@ -144,10 +144,11 @@ extern int tr_main(int argc, char **argv)
int output_length=0, input_length; int output_length=0, input_length;
int index = 1; int index = 1;
int i; int i;
/* set up big arrays here (better than making a bunch of static arrays up top) */ RESERVE_BB_BUFFER(output, BUFSIZ);
unsigned char output[BUFSIZ], input[BUFSIZ]; RESERVE_BB_BUFFER(input, BUFSIZ);
unsigned char vector[ASCII + 1]; RESERVE_BB_UBUFFER(vector, ASCII+1);
char invec[ASCII + 1], outvec[ASCII + 1]; RESERVE_BB_BUFFER(invec, ASCII+1);
RESERVE_BB_BUFFER(outvec, ASCII+1);
/* ... but make them available globally */ /* ... but make them available globally */
poutput = output; poutput = output;

View File

@ -175,8 +175,8 @@ extern int cp_mv_main(int argc, char **argv)
{ {
volatile int i; volatile int i;
int c; int c;
char baseDestName[BUFSIZ + 1]; /* not declared globally == less bss used */ RESERVE_BB_BUFFER(baseDestName,BUFSIZ + 1);
pBaseDestName = baseDestName; /* but available globally */ pBaseDestName = baseDestName; /* available globally */
if (*applet_name == 'c' && *(applet_name + 1) == 'p') if (*applet_name == 'c' && *(applet_name + 1) == 'p')
dz_i = is_cp; dz_i = is_cp;

View File

@ -402,7 +402,7 @@ The problem with these is that any time any busybox app is run, you pay a
memory penalty for this buffer, even if the applet that uses said buffer is memory penalty for this buffer, even if the applet that uses said buffer is
not run. This can be fixed, thusly: not run. This can be fixed, thusly:
static char *buffer static char *buffer;
... ...
other_func() other_func()
{ {
@ -418,7 +418,7 @@ mallocing the buffers (and thus growing the text size), buffers can be
declared on the stack in the *_main() function and made available globally by declared on the stack in the *_main() function and made available globally by
assigning them to a global pointer thusly: assigning them to a global pointer thusly:
static char *pbuffer static char *pbuffer;
... ...
other_func() other_func()
{ {
@ -430,13 +430,13 @@ assigning them to a global pointer thusly:
pbuffer = buffer; /* but available globally */ pbuffer = buffer; /* but available globally */
... ...
Thus: This last approach has some advantages (low code size, space not used until
- global static buffers are eliminated it's needed), but can be a problem in some low resource machines that have
- we don't grow the text segment as much because no malloc() call is made; very limited stack space (e.g., uCLinux). busybox.h declares a macro that
memory is automatically allocated on the stack when execution context implements compile-time selection between xmalloc() and stack creation, so
enters the function. (We still grow text a little bit because of the you can code the line in question as
assignment, but that's cheap compared to a function call.) RESERVE_BB_BUFFER(buffer, BUFSIZ);
- the buffer is still available globally via the pointer and the right thing will happen, based on the customer's configuration.

View File

@ -1222,8 +1222,8 @@ int gunzip_main(int argc, char **argv)
int force = 0; int force = 0;
struct stat statBuf; struct stat statBuf;
char *delFileName; char *delFileName;
char ifname[MAX_PATH_LEN + 1]; /* input file name */ RESERVE_BB_BUFFER(ifname, MAX_PATH_LEN+1); /* input file name */
char ofname[MAX_PATH_LEN + 1]; /* output file name */ RESERVE_BB_BUFFER(ofname, MAX_PATH_LEN+1); /* output file name */
method = DEFLATED; /* default compression method */ method = DEFLATED; /* default compression method */
exit_code = OK; /* let's go out on a limb and assume everything will run fine (wink wink) */ exit_code = OK; /* let's go out on a limb and assume everything will run fine (wink wink) */

View File

@ -266,4 +266,12 @@ char *format(unsigned long val, unsigned long hr);
#define GIGABYTE (MEGABYTE*1024) #define GIGABYTE (MEGABYTE*1024)
#endif #endif
#ifdef BB_FEATURE_BUFFERS_GO_ON_STACK
#define RESERVE_BB_BUFFER(buffer,len) char buffer[len]
#define RESERVE_BB_UBUFFER(buffer,len) unsigned char buffer[len]
#else
#define RESERVE_BB_BUFFER(buffer,len) char *buffer=xmalloc(len)
#define RESERVE_BB_UBUFFER(buffer,len) unsigned char *buffer=xmalloc(len)
#endif
#endif /* _BB_INTERNAL_H_ */ #endif /* _BB_INTERNAL_H_ */

View File

@ -51,7 +51,7 @@ static void myread(int num, char *buffer)
int rpmunpack_main(int argc, char **argv) int rpmunpack_main(int argc, char **argv)
{ {
int len, status = 0; int len, status = 0;
char buffer[BUFSIZ]; RESERVE_BB_BUFFER(buffer, BUFSIZ);
/* Get our own program name */ /* Get our own program name */
if ((progname = strrchr(argv[0], '/')) == NULL) if ((progname = strrchr(argv[0], '/')) == NULL)

View File

@ -209,7 +209,7 @@ static void domark(int sig)
static const int BUFSIZE = 1023; static const int BUFSIZE = 1023;
static int serveConnection (int conn) static int serveConnection (int conn)
{ {
char buf[ BUFSIZE + 1 ]; RESERVE_BB_BUFFER(buf, BUFSIZE + 1);
int n_read; int n_read;
while ((n_read = read (conn, buf, BUFSIZE )) > 0) { while ((n_read = read (conn, buf, BUFSIZE )) > 0) {
@ -296,7 +296,7 @@ static void doSyslogd (void)
int sock_fd; int sock_fd;
fd_set fds; fd_set fds;
char lfile[BUFSIZ]; RESERVE_BB_BUFFER(lfile, BUFSIZ);
/* Set up signal handlers. */ /* Set up signal handlers. */
signal (SIGINT, quit_signal); signal (SIGINT, quit_signal);

View File

@ -209,7 +209,7 @@ static void domark(int sig)
static const int BUFSIZE = 1023; static const int BUFSIZE = 1023;
static int serveConnection (int conn) static int serveConnection (int conn)
{ {
char buf[ BUFSIZE + 1 ]; RESERVE_BB_BUFFER(buf, BUFSIZE + 1);
int n_read; int n_read;
while ((n_read = read (conn, buf, BUFSIZE )) > 0) { while ((n_read = read (conn, buf, BUFSIZE )) > 0) {
@ -296,7 +296,7 @@ static void doSyslogd (void)
int sock_fd; int sock_fd;
fd_set fds; fd_set fds;
char lfile[BUFSIZ]; RESERVE_BB_BUFFER(lfile, BUFSIZ);
/* Set up signal handlers. */ /* Set up signal handlers. */
signal (SIGINT, quit_signal); signal (SIGINT, quit_signal);

9
tr.c
View File

@ -144,10 +144,11 @@ extern int tr_main(int argc, char **argv)
int output_length=0, input_length; int output_length=0, input_length;
int index = 1; int index = 1;
int i; int i;
/* set up big arrays here (better than making a bunch of static arrays up top) */ RESERVE_BB_BUFFER(output, BUFSIZ);
unsigned char output[BUFSIZ], input[BUFSIZ]; RESERVE_BB_BUFFER(input, BUFSIZ);
unsigned char vector[ASCII + 1]; RESERVE_BB_UBUFFER(vector, ASCII+1);
char invec[ASCII + 1], outvec[ASCII + 1]; RESERVE_BB_BUFFER(invec, ASCII+1);
RESERVE_BB_BUFFER(outvec, ASCII+1);
/* ... but make them available globally */ /* ... but make them available globally */
poutput = output; poutput = output;