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)
- Added <postcheck> support to the test harness.
This release includes the following changes:
- o Added curl_multi_socket_action()
- o Deprecated curl_multi_socket()
+ o added curl_multi_socket_action()
+ o deprecated curl_multi_socket()
+ o uses less memory in non-pipelined use cases
This release includes the following bugfixes:
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:
http://personal1.iddeo.es/andresgarci/tclcurl/english/
}
/* 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 {
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]",
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);
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;
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
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 */
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?? */