From 5db38b38f5c2497fc1e269afb1fbb50aaf6cf8e4 Mon Sep 17 00:00:00 2001 From: Tim Woodall Date: Tue, 29 Nov 2005 17:33:01 +0000 Subject: [PATCH] corrections for latency issue - don't do additional select until non-blocking read fails - don't do an additional read for 0 byte message This commit was SVN r8312. --- ompi/mca/btl/tcp/btl_tcp_frag.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ompi/mca/btl/tcp/btl_tcp_frag.c b/ompi/mca/btl/tcp/btl_tcp_frag.c index 12b4fa8de2..f47fe3b223 100644 --- a/ompi/mca/btl/tcp/btl_tcp_frag.c +++ b/ompi/mca/btl/tcp/btl_tcp_frag.c @@ -116,10 +116,13 @@ bool mca_btl_tcp_frag_send(mca_btl_tcp_frag_t* frag, int sd) bool mca_btl_tcp_frag_recv(mca_btl_tcp_frag_t* frag, int sd) { - int cnt=-1; + int cnt; size_t i, num_vecs; +repeat: + /* non-blocking read, but continue if interrupted */ + cnt = -1; while(cnt < 0) { cnt = readv(sd, frag->iov_ptr, frag->iov_cnt); if(cnt < 0) { @@ -167,13 +170,13 @@ bool mca_btl_tcp_frag_recv(mca_btl_tcp_frag_t* frag, int sd) if(frag->iov_cnt == 0) { switch(frag->hdr.type) { case MCA_BTL_TCP_HDR_TYPE_SEND: - if(frag->iov_idx == 1) { + if(frag->iov_idx == 1 && frag->hdr.size) { frag->iov[1].iov_base = (void*)(frag+1); frag->iov[1].iov_len = frag->hdr.size; frag->segments[0].seg_addr.pval = frag+1; frag->segments[0].seg_len = frag->hdr.size; frag->iov_cnt++; - return false; + goto repeat; } break; case MCA_BTL_TCP_HDR_TYPE_PUT: @@ -181,14 +184,14 @@ bool mca_btl_tcp_frag_recv(mca_btl_tcp_frag_t* frag, int sd) frag->iov[1].iov_base = (void*)frag->segments; frag->iov[1].iov_len = frag->hdr.count * sizeof(mca_btl_base_segment_t); frag->iov_cnt++; - return false; + goto repeat; } else if (frag->iov_idx == 2) { for(i=0; ihdr.count; i++) { frag->iov[i+2].iov_base = frag->segments[i].seg_addr.pval; frag->iov[i+2].iov_len = frag->segments[i].seg_len; frag->iov_cnt++; } - return false; + goto repeat; } break; case MCA_BTL_TCP_HDR_TYPE_GET: