mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
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.
This commit is contained in:
parent
6a35841b2e
commit
bc1ae973da
5
CHANGES
5
CHANGES
@ -6,6 +6,11 @@
|
|||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
Daniel S (24 April 2007)
|
||||||
|
- 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.
|
||||||
|
|
||||||
Dan F (23 April 2007)
|
Dan F (23 April 2007)
|
||||||
- Added <postcheck> support to the test harness.
|
- Added <postcheck> support to the test harness.
|
||||||
|
|
||||||
|
@ -11,8 +11,9 @@ Curl and libcurl 7.16.3
|
|||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o Added curl_multi_socket_action()
|
o added curl_multi_socket_action()
|
||||||
o Deprecated curl_multi_socket()
|
o deprecated curl_multi_socket()
|
||||||
|
o uses less memory in non-pipelined use cases
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ This release includes the following known bugs:
|
|||||||
|
|
||||||
Other curl-related news:
|
Other curl-related news:
|
||||||
|
|
||||||
o PycURL 7.16.2 was released: http://pycurl.sf.net/
|
o PycURL 7.16.2.1 was released: http://pycurl.sf.net/
|
||||||
o TclCurl 7.16.2 was released:
|
o TclCurl 7.16.2 was released:
|
||||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||||
|
|
||||||
|
@ -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,
|
/* If we come here, it means that there is no data to read from the buffer,
|
||||||
* so we read from the socket */
|
* so we read from the socket */
|
||||||
bytesfromsocket = MIN(sizerequested, sizeof(conn->master_buffer));
|
bytesfromsocket = MIN(sizerequested, BUFSIZE * sizeof (char));
|
||||||
buffertofill = conn->master_buffer;
|
buffertofill = conn->master_buffer;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -289,8 +289,13 @@ static void read_rewind(struct connectdata *conn,
|
|||||||
size_t show;
|
size_t show;
|
||||||
|
|
||||||
show = MIN(conn->buf_len - conn->read_pos, sizeof(buf)-1);
|
show = MIN(conn->buf_len - conn->read_pos, sizeof(buf)-1);
|
||||||
memcpy(buf, conn->master_buffer + conn->read_pos, show);
|
if (conn->master_buffer) {
|
||||||
buf[show] = '\0';
|
memcpy(buf, conn->master_buffer + conn->read_pos, show);
|
||||||
|
buf[show] = '\0';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buf[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
DEBUGF(infof(conn->data,
|
DEBUGF(infof(conn->data,
|
||||||
"Buffer after stream rewind (read_pos = %d): [%s]",
|
"Buffer after stream rewind (read_pos = %d): [%s]",
|
||||||
|
12
lib/url.c
12
lib/url.c
@ -1789,6 +1789,7 @@ static void conn_free(struct connectdata *conn)
|
|||||||
Curl_safefree(conn->trailer);
|
Curl_safefree(conn->trailer);
|
||||||
Curl_safefree(conn->host.rawalloc); /* host name buffer */
|
Curl_safefree(conn->host.rawalloc); /* host name buffer */
|
||||||
Curl_safefree(conn->proxy.rawalloc); /* proxy 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->send_pipe, NULL);
|
||||||
Curl_llist_destroy(conn->recv_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
|
to not have to modify everything at once, we allocate a temporary
|
||||||
connection data struct and fill in for comparison purposes. */
|
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) {
|
if(!conn) {
|
||||||
*in_connect = NULL; /* clear the pointer */
|
*in_connect = NULL; /* clear the pointer */
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@ -2835,6 +2836,14 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
any failure */
|
any failure */
|
||||||
*in_connect = conn;
|
*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 */
|
/* and we setup a few fields in case we end up actually using this struct */
|
||||||
|
|
||||||
conn->data = data; /* Setup the association between this connection
|
conn->data = data; /* Setup the association between this connection
|
||||||
@ -3803,6 +3812,7 @@ else {
|
|||||||
Curl_safefree(old_conn->proxypasswd);
|
Curl_safefree(old_conn->proxypasswd);
|
||||||
Curl_llist_destroy(old_conn->send_pipe, NULL);
|
Curl_llist_destroy(old_conn->send_pipe, NULL);
|
||||||
Curl_llist_destroy(old_conn->recv_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 */
|
free(old_conn); /* we don't need this anymore */
|
||||||
|
|
||||||
|
@ -868,7 +868,8 @@ struct connectdata {
|
|||||||
struct curl_llist *recv_pipe; /* List of handles waiting to read
|
struct curl_llist *recv_pipe; /* List of handles waiting to read
|
||||||
their responses on this pipeline */
|
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 read_pos; /* Current read position in the master buffer */
|
||||||
size_t buf_len; /* Length of the buffer?? */
|
size_t buf_len; /* Length of the buffer?? */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user