}
}
- isc_mem_put(handle->sock->mgr->mctx, send_req->data.base,
- send_req->data.length);
+ /* We are tying to avoid a memory allocation for small write
+ * requests. See the mirroring code in the tls_send_outgoing()
+ * function. */
+ if (ISC_UNLIKELY(send_req->data.length > sizeof(send_req->smallbuf))) {
+ isc_mem_put(handle->sock->mgr->mctx, send_req->data.base,
+ send_req->data.length);
+ } else {
+ INSIST(&send_req->smallbuf[0] == send_req->data.base);
+ }
isc_mem_put(handle->sock->mgr->mctx, send_req, sizeof(*send_req));
tlssock->tlsstream.nsending--;
}
send_req = isc_mem_get(sock->mgr->mctx, sizeof(*send_req));
- *send_req = (isc_nmsocket_tls_send_req_t){
- .finish = finish,
- .data.base = isc_mem_get(sock->mgr->mctx, pending),
- .data.length = pending
- };
+ *send_req = (isc_nmsocket_tls_send_req_t){ .finish = finish,
+ .data.length = pending };
+
+ /* Let's try to avoid a memory allocation for small write requests */
+ if (ISC_UNLIKELY((size_t)pending > sizeof(send_req->smallbuf))) {
+ send_req->data.base = isc_mem_get(sock->mgr->mctx, pending);
+ } else {
+ send_req->data.base = &send_req->smallbuf[0];
+ }
isc__nmsocket_attach(sock, &send_req->tlssock);
if (cb != NULL) {