Commit Larry Doolittle's buffers-on-stack/buffers-via-malloc patch.
-Erik
This commit is contained in:
parent
ffde8673fe
commit
d35c21587a
5
Config.h
5
Config.h
@ -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
|
||||||
|
@ -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) */
|
||||||
|
@ -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_ */
|
||||||
|
@ -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;
|
||||||
|
4
cp_mv.c
4
cp_mv.c
@ -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;
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4
gunzip.c
4
gunzip.c
@ -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) */
|
||||||
|
@ -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_ */
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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
9
tr.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user