Catch a SIGPIPE and allow it to be harmless. Register a no-op SIGPIPE
handler before the write() and de-register it afterwards. Determine if the write() succeeded or failed by the return of write(). This commit was SVN r10858.
Этот коммит содержится в:
родитель
416e9de22d
Коммит
82161d20ca
@ -9,6 +9,7 @@
|
|||||||
* University of Stuttgart. All rights reserved.
|
* University of Stuttgart. All rights reserved.
|
||||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
@ -42,9 +43,14 @@
|
|||||||
#ifdef HAVE_NETINET_TCP_H
|
#ifdef HAVE_NETINET_TCP_H
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include "opal/event/event.h"
|
||||||
#include "orte/mca/ns/ns_types.h"
|
#include "orte/mca/ns/ns_types.h"
|
||||||
#include "orte/mca/oob/tcp/oob_tcp.h"
|
#include "orte/mca/oob/tcp/oob_tcp.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local functions
|
||||||
|
*/
|
||||||
|
static void noop(int fd, short event, void *arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ping a peer to see if it is alive.
|
* Ping a peer to see if it is alive.
|
||||||
@ -64,6 +70,9 @@ int mca_oob_tcp_ping(
|
|||||||
fd_set fdset;
|
fd_set fdset;
|
||||||
mca_oob_tcp_hdr_t hdr;
|
mca_oob_tcp_hdr_t hdr;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
#ifndef __WINDOWS__
|
||||||
|
struct opal_event sigpipe_handler;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* parse uri string */
|
/* parse uri string */
|
||||||
if(ORTE_SUCCESS != (rc = mca_oob_tcp_parse_uri(uri, &inaddr))) {
|
if(ORTE_SUCCESS != (rc = mca_oob_tcp_parse_uri(uri, &inaddr))) {
|
||||||
@ -139,9 +148,22 @@ int mca_oob_tcp_ping(
|
|||||||
}
|
}
|
||||||
hdr.msg_dst = *name;
|
hdr.msg_dst = *name;
|
||||||
hdr.msg_type = MCA_OOB_TCP_PROBE;
|
hdr.msg_type = MCA_OOB_TCP_PROBE;
|
||||||
|
|
||||||
MCA_OOB_TCP_HDR_HTON(&hdr);
|
MCA_OOB_TCP_HDR_HTON(&hdr);
|
||||||
if((rc = write(sd, &hdr, sizeof(hdr))) != sizeof(hdr)) {
|
|
||||||
|
#ifndef __WINDOWS__
|
||||||
|
/* Ignore SIGPIPE in the write -- determine success or failure in
|
||||||
|
the ping by looking at the return code from write() */
|
||||||
|
opal_signal_set(&sigpipe_handler, SIGPIPE,
|
||||||
|
noop, &sigpipe_handler);
|
||||||
|
opal_signal_add(&sigpipe_handler, NULL);
|
||||||
|
#endif
|
||||||
|
/* Do the write and see what happens */
|
||||||
|
rc = write(sd, &hdr, sizeof(hdr));
|
||||||
|
#ifndef __WINDOWS__
|
||||||
|
/* Now de-register the handler */
|
||||||
|
opal_signal_del(&sigpipe_handler);
|
||||||
|
#endif
|
||||||
|
if (rc != sizeof(hdr)) {
|
||||||
close(sd);
|
close(sd);
|
||||||
return ORTE_ERR_UNREACH;
|
return ORTE_ERR_UNREACH;
|
||||||
}
|
}
|
||||||
@ -168,3 +190,7 @@ int mca_oob_tcp_ping(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void noop(int fd, short event, void *arg)
|
||||||
|
{
|
||||||
|
/* Nothing */
|
||||||
|
}
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user