1
1

fixed blocking send/recv on non-blocking sockets

This commit was SVN r855.
Этот коммит содержится в:
Tim Woodall 2004-03-15 20:55:05 +00:00
родитель 5e8e4c6494
Коммит abfa077cea

Просмотреть файл

@ -129,13 +129,12 @@ static int mca_ptl_tcp_peer_send_blocking(mca_ptl_base_peer_t* ptl_peer, void* d
while(cnt < size) { while(cnt < size) {
int retval = send(ptl_peer->peer_sd, ptr+cnt, size-cnt, 0); int retval = send(ptl_peer->peer_sd, ptr+cnt, size-cnt, 0);
if(retval < 0) { if(retval < 0) {
if(errno == EINTR) if(errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) {
continue;
if(errno != EAGAIN && errno != EWOULDBLOCK) {
lam_output(0, "mca_ptl_tcp_peer_send_blocking: send() failed with errno=%d\n",errno); lam_output(0, "mca_ptl_tcp_peer_send_blocking: send() failed with errno=%d\n",errno);
mca_ptl_tcp_peer_close_i(ptl_peer); mca_ptl_tcp_peer_close_i(ptl_peer);
return -1; return -1;
} }
continue;
} }
cnt += retval; cnt += retval;
} }
@ -265,16 +264,17 @@ static int mca_ptl_tcp_peer_recv_blocking(mca_ptl_base_peer_t* ptl_peer, void* d
/* socket is non-blocking so handle errors */ /* socket is non-blocking so handle errors */
if(retval < 0) { if(retval < 0) {
if(errno == EINTR) if(errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK) {
continue;
if(errno != EAGAIN && errno != EWOULDBLOCK) {
lam_output(0, "mca_ptl_tcp_peer_recv_blocking: recv() failed with errno=%d\n",errno); lam_output(0, "mca_ptl_tcp_peer_recv_blocking: recv() failed with errno=%d\n",errno);
mca_ptl_tcp_peer_close_i(ptl_peer); mca_ptl_tcp_peer_close_i(ptl_peer);
return -1; return -1;
} }
continue;
} }
cnt += retval; cnt += retval;
} }
if((int)cnt == -1)
lam_output(0, "mca_ptl_tcp_peer_recv_blocking: invalid cnt\n");
return cnt; return cnt;
} }
@ -290,16 +290,19 @@ static int mca_ptl_tcp_peer_recv_connect_ack(mca_ptl_base_peer_t* ptl_peer)
{ {
uint32_t size_n, size_h; uint32_t size_n, size_h;
void* guid; void* guid;
int rc;
mca_ptl_tcp_proc_t* ptl_proc = ptl_peer->peer_proc; mca_ptl_tcp_proc_t* ptl_proc = ptl_peer->peer_proc;
if(mca_ptl_tcp_peer_recv_blocking(ptl_peer, &size_n, sizeof(size_n)) != sizeof(size_n)) if((rc = mca_ptl_tcp_peer_recv_blocking(ptl_peer, &size_n, sizeof(size_n))) != sizeof(size_n))
return LAM_ERR_UNREACH; return LAM_ERR_UNREACH;
size_h = ntohl(size_n); size_h = ntohl(size_n);
guid = malloc(size_h); guid = malloc(size_h);
if(NULL == guid) if(NULL == guid) {
lam_output(0, "mca_ptl_tcp_peer_recv_connect_ack: malloc(%d) failed\n", size_h);
return LAM_ERR_OUT_OF_RESOURCE; return LAM_ERR_OUT_OF_RESOURCE;
}
if(mca_ptl_tcp_peer_recv_blocking(ptl_peer, guid, size_h) != size_h) { if((rc = mca_ptl_tcp_peer_recv_blocking(ptl_peer, guid, size_h)) != size_h) {
free(guid); free(guid);
return LAM_ERR_UNREACH; return LAM_ERR_UNREACH;
} }