diff options
Diffstat (limited to 'rpc/rpc-lib/src/rpc-transport.c')
-rw-r--r-- | rpc/rpc-lib/src/rpc-transport.c | 96 |
1 files changed, 54 insertions, 42 deletions
diff --git a/rpc/rpc-lib/src/rpc-transport.c b/rpc/rpc-lib/src/rpc-transport.c index b77ea2aa553..50379c14950 100644 --- a/rpc/rpc-lib/src/rpc-transport.c +++ b/rpc/rpc-lib/src/rpc-transport.c @@ -628,20 +628,10 @@ rpc_transport_pollin_destroy (rpc_transport_pollin_t *pollin) goto out; } - if (pollin->vectored) { - if (pollin->data.vector.iobuf1) { - iobuf_unref (pollin->data.vector.iobuf1); - } - - if (pollin->data.vector.iobuf2) { - iobuf_unref (pollin->data.vector.iobuf2); - } - } else { - if (pollin->data.simple.iobuf) { - iobuf_unref (pollin->data.simple.iobuf); - } + if (pollin->iobref) { + iobref_unref (pollin->iobref); } - + if (pollin->private) { /* */ GF_FREE (pollin->private); @@ -654,9 +644,8 @@ out: rpc_transport_pollin_t * -rpc_transport_pollin_alloc (rpc_transport_t *this, struct iobuf *iobuf, - size_t size, struct iobuf *vectored_buf, - size_t vectored_size, void *private) +rpc_transport_pollin_alloc (rpc_transport_t *this, struct iovec *vector, + int count, struct iobref *iobref, void *private) { rpc_transport_pollin_t *msg = NULL; msg = GF_CALLOC (1, sizeof (*msg), gf_common_mt_rpc_trans_pollin_t); @@ -665,19 +654,15 @@ rpc_transport_pollin_alloc (rpc_transport_t *this, struct iobuf *iobuf, goto out; } - if (vectored_buf) { + if (count == 2) { msg->vectored = 1; - msg->data.vector.iobuf1 = iobuf_ref (iobuf); - msg->data.vector.size1 = size; - - msg->data.vector.iobuf2 = iobuf_ref (vectored_buf); - msg->data.vector.size2 = vectored_size; - } else { - msg->data.simple.iobuf = iobuf_ref (iobuf); - msg->data.simple.size = size; } + memcpy (msg->vector, vector, count * sizeof (*vector)); + msg->count = count; + msg->iobref = iobref_ref (iobref); msg->private = private; + out: return msg; } @@ -698,6 +683,7 @@ rpc_transport_same_process_pollin_alloc (rpc_transport_t *this, int progpayloadlen = 0; char vectored = 0; char *hdr = NULL, *progpayloadbuf = NULL; + struct iobuf *iobuf = NULL; if (!rpchdr || !proghdr) { goto err; @@ -729,47 +715,72 @@ rpc_transport_same_process_pollin_alloc (rpc_transport_t *this, } if (vectored) { - msg->data.vector.iobuf1 = iobuf_get (this->ctx->iobuf_pool); - if (!msg->data.vector.iobuf1) { + msg->iobref = iobref_new (); + if (!msg->iobref) { + gf_log ("rpc-transport", GF_LOG_ERROR, + "out of memory"); + goto err; + } + + iobuf = iobuf_get (this->ctx->iobuf_pool); + if (!iobuf) { gf_log ("rpc_transport", GF_LOG_ERROR, "out of memory"); goto err; } - msg->data.vector.size1 = rpchdrlen + proghdrlen; - hdr = iobuf_ptr (msg->data.vector.iobuf1); + iobref_add (msg->iobref, iobuf); + iobuf_unref (iobuf); + + msg->vector[0].iov_len = rpchdrlen + proghdrlen; + msg->vector[0].iov_base = hdr = iobuf_ptr (iobuf); if (!is_request && rsp) { - msg->data.vector.iobuf2 = rsp->rspbuf; - progpayloadbuf = rsp->rspvec->iov_base; + msg->vector[1] = rsp->rsp_payload[0]; + progpayloadbuf = rsp->rsp_payload[0].iov_base; } else { - msg->data.vector.iobuf2 = iobuf_get (this->ctx->iobuf_pool); - if (!msg->data.vector.iobuf2) { + iobuf = iobuf_get (this->ctx->iobuf_pool); + if (!iobuf) { gf_log ("rpc_transport", GF_LOG_ERROR, "out of memory"); goto err; } - progpayloadbuf = iobuf_ptr (msg->data.vector.iobuf2); + iobref_add (msg->iobref, iobuf); + iobuf_unref (iobuf); + + msg->vector[1].iov_base + = progpayloadbuf = iobuf_ptr (iobuf); } - msg->data.vector.size2 = progpayloadlen; + msg->vector[1].iov_len = progpayloadlen; } else { if (!is_request && rsp) { /* FIXME: Assuming rspvec contains only one vector */ - hdr = rsp->rspvec->iov_base; - msg->data.simple.iobuf = rsp->rspbuf; + hdr = rsp->rsphdr[0].iov_base; + msg->vector[0] = rsp->rsphdr[0]; } else { - msg->data.simple.iobuf = iobuf_get (this->ctx->iobuf_pool); - if (!msg->data.simple.iobuf) { + msg->iobref = iobref_new (); + if (!msg->iobref) { + gf_log ("rpc-transport", GF_LOG_ERROR, + "out of memory"); + goto err; + } + + iobuf = iobuf_get (this->ctx->iobuf_pool); + if (!iobuf) { gf_log ("rpc_transport", GF_LOG_ERROR, "out of memory"); goto err; } - hdr = iobuf_ptr (msg->data.simple.iobuf); + iobref_add (msg->iobref, iobuf); + iobuf_unref (iobuf); + + hdr = iobuf_ptr (iobuf); + msg->vector[0].iov_base = hdr; } - msg->data.simple.size = rpchdrlen + proghdrlen; + msg->vector[0].iov_len = rpchdrlen + proghdrlen; } iov_unload (hdr, rpchdr, rpchdrcount); @@ -1253,7 +1264,8 @@ rpc_transport_peerproc (void *trans_data) } pthread_mutex_unlock (&trans->handover.mutex); - rpc_transport_notify (trans, RPC_TRANSPORT_MSG_RECEIVED, msg->pollin); + rpc_transport_notify (trans, RPC_TRANSPORT_MSG_RECEIVED, + msg->pollin); rpc_transport_handover_destroy (msg); } } |