diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2011-09-30 20:19:44 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2011-09-30 20:19:44 -0700 |
commit | fcb83e31a0dfd85e4ec105dd656ed405e64c387b (patch) | |
tree | fe2683f5d3147370b8b95e35e4abff2fe8fb1cc5 | |
parent | fafdfa0e1a54e19f11e220340df0557c794fabc6 (diff) |
Allocate buffers dynamically as needed instead of as part of fdinfo struct
Previously we'd allocate a buffer of 32k each for each fd up to the
compiled in StaticMaxFD, which could be as large as 65535 on some
systems (that's the Solaris 64-bit default FD_SETSIZE), resulting in
gigabytes of bss allocation on startup.
Now we don't allocate until we're actually setting up the fdinfo for
use as part of a client<->server connection.
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
-rw-r--r-- | scope.c | 16 | ||||
-rw-r--r-- | scope.h | 2 |
2 files changed, 17 insertions, 1 deletions
@@ -946,6 +946,12 @@ SetUpPair( FDinfo[client].Server = false; FDinfo[client].pair = server; FDinfo[client].ClientNumber = clientNumber; + if (FDinfo[client].buffer == NULL) + { + FDinfo[client].buffer = calloc(1, BUFFER_SIZE); + if (FDinfo[client].buffer == NULL) + panic("unable to allocate client buffer"); + } FDinfo[client].bufcount = 0; FDinfo[client].buflimit = -1; FDinfo[client].bufdelivered = 0; @@ -954,6 +960,12 @@ SetUpPair( FDinfo[server].Server = true; FDinfo[server].pair = client; FDinfo[server].ClientNumber = FDinfo[client].ClientNumber; + if (FDinfo[server].buffer == NULL) + { + FDinfo[server].buffer = calloc(1, BUFFER_SIZE); + if (FDinfo[server].buffer == NULL) + panic("unable to allocate server buffer"); + } FDinfo[server].bufcount = 0; FDinfo[server].buflimit = -1; FDinfo[server].bufdelivered = 0; @@ -973,12 +985,16 @@ ResetPair ( { if (client >= 0) { + free(FDinfo[client].buffer); + FDinfo[client].buffer = NULL; FDinfo[client].bufcount = 0; FDinfo[client].buflimit = -1; FDinfo[client].bufdelivered = 0; } if (server >= 0) { + free(FDinfo[server].buffer); + FDinfo[server].buffer = NULL; FDinfo[server].bufcount = 0; FDinfo[server].buflimit = -1; FDinfo[server].bufdelivered = 0; @@ -109,7 +109,7 @@ struct fdinfo Boolean Server; long ClientNumber; FD pair; - unsigned char buffer[BUFFER_SIZE]; + unsigned char *buffer; int bufcount; int bufstart; int buflimit; /* limited writes */ |