summaryrefslogtreecommitdiff
path: root/unit
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2019-01-11 10:14:50 -0300
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2019-01-14 14:26:00 -0300
commitfa69d5108450b8e4d9f85015466f31b9d6794f0b (patch)
tree4872cded9a34e6e69d63d8a7c51952a6981ac9b6 /unit
parent1e5f903205905fe7ebce897d1b7e6f5e8ab591f6 (diff)
downloadbluez-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.c27
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;
}