diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2019-01-11 10:14:50 -0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2019-01-14 14:26:00 -0300 |
commit | fa69d5108450b8e4d9f85015466f31b9d6794f0b (patch) | |
tree | 4872cded9a34e6e69d63d8a7c51952a6981ac9b6 /unit | |
parent | 1e5f903205905fe7ebce897d1b7e6f5e8ab591f6 (diff) | |
download | bluez-fa69d5108450b8e4d9f85015466f31b9d6794f0b.tar.gz |
unit/test-sdp: Avoid extra copies when sending a PDU
Make use of writev instead of creating a separate buffer to transmit
the data.
Diffstat (limited to 'unit')
-rw-r--r-- | unit/test-sdp.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/unit/test-sdp.c b/unit/test-sdp.c index 5a50cbbf1..66da038cd 100644 --- a/unit/test-sdp.c +++ b/unit/test-sdp.c @@ -29,6 +29,7 @@ #include <stdlib.h> #include <stdbool.h> #include <sys/socket.h> +#include <sys/uio.h> #include <glib.h> @@ -191,31 +192,23 @@ static gboolean send_pdu(gpointer user_data) { struct context *context = user_data; const struct sdp_pdu *req_pdu; - uint16_t pdu_len; - unsigned char *buf; + struct iovec iov[2]; ssize_t len; req_pdu = &context->data->pdu_list[context->pdu_offset]; - pdu_len = req_pdu->raw_size + context->cont_size; + iov[0].iov_base = (void *) req_pdu->raw_data; + iov[0].iov_len = req_pdu->raw_size; - buf = g_malloc0(pdu_len); + iov[1].iov_base = context->cont_data; + iov[1].iov_len = context->cont_size; - memcpy(buf, req_pdu->raw_data, req_pdu->raw_size); + if (context->cont_size && context->cont_size != req_pdu->cont_len) + put_be16(req_pdu->cont_len, iov[1].iov_base + 4); - if (context->cont_size > 0) { - memcpy(buf + req_pdu->raw_size, context->cont_data, - context->cont_size); - if (context->cont_size != req_pdu->cont_len) - put_be16(req_pdu->cont_len, - buf + req_pdu->raw_size + 4); - } - - len = write(context->fd, buf, pdu_len); - - g_free(buf); + len = writev(context->fd, iov, 2); - g_assert(len == pdu_len); + g_assert(len == (ssize_t) (iov[0].iov_len + iov[1].iov_len)); return FALSE; } |