summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Steinert <mike.steinert@gmail.com>2012-05-24 18:19:10 -0600
committerMichael Steinert <mike.steinert@gmail.com>2012-05-27 10:39:57 -0600
commit8aa339ebfec12b68ce78445137e2cfb7cbc6c272 (patch)
tree9e4fee22ff69d633474c931b1ef3cb7d6a101d5b
parent5b2585dc118f3db07a70575da47503e24986f8e9 (diff)
downloadrabbitmq-c-github-ask-8aa339ebfec12b68ce78445137e2cfb7cbc6c272.tar.gz
Reduce allocations in SSL writev implementations
This change reduces memory allocations by retaining the writev buffer across invocations. Memory is only freed/allocated if the buffer too small. Signed-off-by: Michael Steinert <mike.steinert@gmail.com>
-rw-r--r--librabbitmq/amqp-cyassl.c21
-rw-r--r--librabbitmq/amqp-gnutls.c21
-rw-r--r--librabbitmq/amqp-openssl.c21
-rw-r--r--librabbitmq/amqp-polarssl.c24
4 files changed, 58 insertions, 29 deletions
diff --git a/librabbitmq/amqp-cyassl.c b/librabbitmq/amqp-cyassl.c
index f8e4d40..960e209 100644
--- a/librabbitmq/amqp-cyassl.c
+++ b/librabbitmq/amqp-cyassl.c
@@ -32,6 +32,8 @@
struct amqp_ssl_socket_context {
CYASSL_CTX *ctx;
CYASSL *ssl;
+ char *buffer;
+ size_t length;
};
static ssize_t
@@ -52,26 +54,30 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd,
void *user_data)
{
struct amqp_ssl_socket_context *self = user_data;
- char *buffer, *bufferp;
ssize_t written = -1;
+ char *bufferp;
size_t bytes;
int i;
bytes = 0;
for (i = 0; i < iovcnt; ++i) {
bytes += iov[i].iov_len;
}
- buffer = malloc(bytes);
- if (!buffer) {
- goto exit;
+ if (self->length < bytes) {
+ free(self->buffer);
+ self->buffer = malloc(bytes);
+ if (!self->buffer) {
+ self->length = 0;
+ goto exit;
+ }
+ self->length = bytes;
}
- bufferp = buffer;
+ bufferp = self->buffer;
for (i = 0; i < iovcnt; ++i) {
memcpy(bufferp, iov[i].iov_base, iov[i].iov_len);
bufferp += iov[i].iov_len;
}
- written = CyaSSL_write(self->ssl, buffer, bytes);
+ written = CyaSSL_write(self->ssl, self->buffer, bytes);
exit:
- free(buffer);
return written;
}
@@ -95,6 +101,7 @@ amqp_ssl_socket_close(int sockfd,
if (self) {
CyaSSL_free(self->ssl);
CyaSSL_CTX_free(self->ctx);
+ free(self->buffer);
free(self);
}
if (sockfd >= 0) {
diff --git a/librabbitmq/amqp-gnutls.c b/librabbitmq/amqp-gnutls.c
index a435371..3268007 100644
--- a/librabbitmq/amqp-gnutls.c
+++ b/librabbitmq/amqp-gnutls.c
@@ -34,6 +34,8 @@ struct amqp_ssl_socket_context {
gnutls_session_t session;
gnutls_certificate_credentials_t credentials;
char *host;
+ char *buffer;
+ size_t length;
};
static ssize_t
@@ -54,26 +56,30 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd,
void *user_data)
{
struct amqp_ssl_socket_context *self = user_data;
- char *buffer, *bufferp;
ssize_t written = -1;
+ char *bufferp;
size_t bytes;
int i;
bytes = 0;
for (i = 0; i < iovcnt; ++i) {
bytes += iov[i].iov_len;
}
- buffer = malloc(bytes);
- if (!buffer) {
- goto exit;
+ if (self->length < bytes) {
+ free(self->buffer);
+ self->buffer = malloc(bytes);
+ if (!self->buffer) {
+ self->length = 0;
+ goto exit;
+ }
+ self->length = 0;
}
- bufferp = buffer;
+ bufferp = self->buffer;
for (i = 0; i < iovcnt; ++i) {
memcpy(bufferp, iov[i].iov_base, iov[i].iov_len);
bufferp += iov[i].iov_len;
}
- written = gnutls_record_send(self->session, buffer, bytes);
+ written = gnutls_record_send(self->session, self->buffer, bytes);
exit:
- free(buffer);
return written;
}
@@ -101,6 +107,7 @@ amqp_ssl_socket_close(int sockfd,
gnutls_deinit(self->session);
gnutls_certificate_free_credentials(self->credentials);
free(self->host);
+ free(self->buffer);
free(self);
}
return status;
diff --git a/librabbitmq/amqp-openssl.c b/librabbitmq/amqp-openssl.c
index d97aa4c..781ce8a 100644
--- a/librabbitmq/amqp-openssl.c
+++ b/librabbitmq/amqp-openssl.c
@@ -37,6 +37,8 @@
struct amqp_ssl_socket_context {
BIO *bio;
SSL_CTX *ctx;
+ char *buffer;
+ size_t length;
};
static ssize_t
@@ -74,26 +76,30 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd,
void *user_data)
{
struct amqp_ssl_socket_context *self = user_data;
- char *buffer, *bufferp;
ssize_t written = -1;
+ char *bufferp;
size_t bytes;
int i;
bytes = 0;
for (i = 0; i < iovcnt; ++i) {
bytes += iov[i].iov_len;
}
- buffer = malloc(bytes);
- if (!buffer) {
- goto exit;
+ if (self->length < bytes) {
+ free(self->buffer);
+ self->buffer = malloc(bytes);
+ if (!self->buffer) {
+ self->length = 0;
+ goto exit;
+ }
+ self->length = bytes;
}
- bufferp = buffer;
+ bufferp = self->buffer;
for (i = 0; i < iovcnt; ++i) {
memcpy(bufferp, iov[i].iov_base, iov[i].iov_len);
bufferp += iov[i].iov_len;
}
- written = amqp_ssl_socket_send(sockfd, buffer, bytes, 0, self);
+ written = amqp_ssl_socket_send(sockfd, self->buffer, bytes, 0, self);
exit:
- free(buffer);
return written;
}
@@ -131,6 +137,7 @@ amqp_ssl_socket_close(int sockfd,
if (self) {
BIO_free_all(self->bio);
SSL_CTX_free(self->ctx);
+ free(self->buffer);
free(self);
}
return 0 > sockfd ? -1 : 0;
diff --git a/librabbitmq/amqp-polarssl.c b/librabbitmq/amqp-polarssl.c
index e55aa00..55dbc43 100644
--- a/librabbitmq/amqp-polarssl.c
+++ b/librabbitmq/amqp-polarssl.c
@@ -41,6 +41,8 @@ struct amqp_ssl_socket_context {
x509_cert *cert;
ssl_context *ssl;
ssl_session *session;
+ char *buffer;
+ size_t length;
};
static ssize_t
@@ -61,26 +63,31 @@ amqp_ssl_socket_writev(AMQP_UNUSED int sockfd,
void *user_data)
{
struct amqp_ssl_socket_context *self = user_data;
- char *buffer, *bufferp;
ssize_t written = -1;
+ char *bufferp;
size_t bytes;
int i;
bytes = 0;
for (i = 0; i < iovcnt; ++i) {
bytes += iov[i].iov_len;
}
- buffer = malloc(bytes);
- if (!buffer) {
- goto exit;
+ if (self->length < bytes) {
+ free(self->buffer);
+ self->buffer = malloc(bytes);
+ if (!self->buffer) {
+ self->length = 0;
+ goto exit;
+ }
+ self->length = bytes;
}
- bufferp = buffer;
+ bufferp = self->buffer;
for (i = 0; i < iovcnt; ++i) {
memcpy(bufferp, iov[i].iov_base, iov[i].iov_len);
bufferp += iov[i].iov_len;
}
- written = ssl_write(self->ssl, (const unsigned char *)buffer, bytes);
+ written = ssl_write(self->ssl, (const unsigned char *)self->buffer,
+ bytes);
exit:
- free(buffer);
return written;
}
@@ -113,11 +120,12 @@ amqp_ssl_socket_close(int sockfd,
ssl_free(self->ssl);
free(self->ssl);
free(self->session);
- free(self);
+ free(self->buffer);
if (self->sockfd >= 0) {
net_close(sockfd);
status = 0;
}
+ free(self);
}
return status;
}