From bc1ae973daafb5881b65e179d2f5ce891acf22bd Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 24 Apr 2007 10:18:06 +0000 Subject: Robert Iakobashvili made the 'master_buffer' get allocated first once it is can/will be used as it then makes the common cases save 16KB of data for each easy handle that isn't used for pipelining. --- lib/sendf.c | 2 +- lib/transfer.c | 9 +++++++-- lib/url.c | 12 +++++++++++- lib/urldata.h | 3 ++- 4 files changed, 21 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/sendf.c b/lib/sendf.c index bf9ee490a..922550b00 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -495,7 +495,7 @@ int Curl_read(struct connectdata *conn, /* connection data */ } /* If we come here, it means that there is no data to read from the buffer, * so we read from the socket */ - bytesfromsocket = MIN(sizerequested, sizeof(conn->master_buffer)); + bytesfromsocket = MIN(sizerequested, BUFSIZE * sizeof (char)); buffertofill = conn->master_buffer; } else { diff --git a/lib/transfer.c b/lib/transfer.c index 52b4c8966..d007e8814 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -289,8 +289,13 @@ static void read_rewind(struct connectdata *conn, size_t show; show = MIN(conn->buf_len - conn->read_pos, sizeof(buf)-1); - memcpy(buf, conn->master_buffer + conn->read_pos, show); - buf[show] = '\0'; + if (conn->master_buffer) { + memcpy(buf, conn->master_buffer + conn->read_pos, show); + buf[show] = '\0'; + } + else { + buf[0] = '\0'; + } DEBUGF(infof(conn->data, "Buffer after stream rewind (read_pos = %d): [%s]", diff --git a/lib/url.c b/lib/url.c index ddb214d20..659b977d8 100644 --- a/lib/url.c +++ b/lib/url.c @@ -1789,6 +1789,7 @@ static void conn_free(struct connectdata *conn) Curl_safefree(conn->trailer); Curl_safefree(conn->host.rawalloc); /* host name buffer */ Curl_safefree(conn->proxy.rawalloc); /* proxy name buffer */ + Curl_safefree(conn->master_buffer); Curl_llist_destroy(conn->send_pipe, NULL); Curl_llist_destroy(conn->recv_pipe, NULL); @@ -2825,7 +2826,7 @@ static CURLcode CreateConnection(struct SessionHandle *data, to not have to modify everything at once, we allocate a temporary connection data struct and fill in for comparison purposes. */ - conn = (struct connectdata *)calloc(sizeof(struct connectdata), 1); + conn = (struct connectdata *)calloc(1, sizeof(struct connectdata)); if(!conn) { *in_connect = NULL; /* clear the pointer */ return CURLE_OUT_OF_MEMORY; @@ -2835,6 +2836,14 @@ static CURLcode CreateConnection(struct SessionHandle *data, any failure */ *in_connect = conn; + if (data->multi && Curl_multi_canPipeline(data->multi) && + !conn->master_buffer) { + /* Allocate master_buffer to be used for pipelining */ + conn->master_buffer = calloc(BUFSIZE, sizeof (char)); + if (!conn->master_buffer) + return CURLE_OUT_OF_MEMORY; + } + /* and we setup a few fields in case we end up actually using this struct */ conn->data = data; /* Setup the association between this connection @@ -3803,6 +3812,7 @@ else { Curl_safefree(old_conn->proxypasswd); Curl_llist_destroy(old_conn->send_pipe, NULL); Curl_llist_destroy(old_conn->recv_pipe, NULL); + Curl_safefree(old_conn->master_buffer); free(old_conn); /* we don't need this anymore */ diff --git a/lib/urldata.h b/lib/urldata.h index b129ca708..023bc3ca3 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -868,7 +868,8 @@ struct connectdata { struct curl_llist *recv_pipe; /* List of handles waiting to read their responses on this pipeline */ - char master_buffer[BUFSIZE]; /* The master buffer for this connection. */ + char* master_buffer; /* The master buffer allocated on-demand; + used for pipelining. */ size_t read_pos; /* Current read position in the master buffer */ size_t buf_len; /* Length of the buffer?? */ -- cgit v1.2.3