summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Coopersmith <alan.coopersmith@oracle.com>2011-09-30 20:19:44 -0700
committerAlan Coopersmith <alan.coopersmith@oracle.com>2011-09-30 20:19:44 -0700
commitfcb83e31a0dfd85e4ec105dd656ed405e64c387b (patch)
treefe2683f5d3147370b8b95e35e4abff2fe8fb1cc5
parentfafdfa0e1a54e19f11e220340df0557c794fabc6 (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.c16
-rw-r--r--scope.h2
2 files changed, 17 insertions, 1 deletions
diff --git a/scope.c b/scope.c
index f85cdba..686be80 100644
--- a/scope.c
+++ b/scope.c
@@ -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;
diff --git a/scope.h b/scope.h
index d440130..360cdc5 100644
--- a/scope.h
+++ b/scope.h
@@ -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 */