make comm_join work
This commit was SVN r2746.
Этот коммит содержится в:
родитель
65e4b61ec2
Коммит
1d16996a48
@ -31,13 +31,11 @@ int MPI_Comm_disconnect(MPI_Comm *comm)
|
||||
FUNC_NAME);
|
||||
}
|
||||
|
||||
/* disconnect means, just decrease the refcount, without calling
|
||||
attribute delete fnct. etc. (to be verified.).
|
||||
|
||||
Question: do we need a flag verifying which communicators
|
||||
we are allowed to disconnect from ? E.g. what happens,
|
||||
if we disconnect from an MPI-1 communicator derived
|
||||
from MPI_COMM_WORLD ? */
|
||||
if (MPI_COMM_WORLD == *comm || MPI_COMM_SELF == *comm ) {
|
||||
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, FUNC_NAME);
|
||||
}
|
||||
|
||||
(*comm)->c_coll.coll_barrier(*comm);
|
||||
OBJ_RETAIN(*comm);
|
||||
|
||||
*comm = MPI_COMM_NULL;
|
||||
|
@ -31,16 +31,16 @@ static int ompi_socket_recv (int fd, char *buf, int len );
|
||||
|
||||
int MPI_Comm_join(int fd, MPI_Comm *intercomm)
|
||||
{
|
||||
int rc, tag;
|
||||
int rc, tag=OMPI_COMM_JOIN_TAG;
|
||||
size_t size;
|
||||
uint32_t len, rlen;
|
||||
int send_first;
|
||||
uint32_t len, rlen, llen, lrlen;
|
||||
int send_first=1;
|
||||
char *rname, *name;
|
||||
|
||||
ompi_proc_t **myproc=NULL;
|
||||
ompi_communicator_t *newcomp;
|
||||
ompi_ns_cmp_bitmask_t mask;
|
||||
ompi_process_name_t *port_proc_name=NULL, *port_pname=NULL;
|
||||
ompi_process_name_t *port_proc_name=NULL;
|
||||
|
||||
if ( MPI_PARAM_CHECK ) {
|
||||
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
|
||||
@ -56,13 +56,14 @@ int MPI_Comm_join(int fd, MPI_Comm *intercomm)
|
||||
here. */
|
||||
myproc = ompi_proc_self (&size);
|
||||
name = ompi_name_server.get_proc_name_string (&(myproc[0]->proc_name));
|
||||
len = htonl(strlen(name));
|
||||
llen = strlen(name)+1;
|
||||
len = htonl(llen);
|
||||
|
||||
ompi_socket_send( fd, (char *) &len, sizeof(uint32_t));
|
||||
ompi_socket_recv (fd, (char *) &rlen, sizeof(uint32_t));
|
||||
|
||||
rlen = ntohl(rlen);
|
||||
rname = (char *) malloc (rlen);
|
||||
lrlen = ntohl(rlen);
|
||||
rname = (char *) malloc (lrlen);
|
||||
if ( NULL == rname ) {
|
||||
*intercomm = MPI_COMM_NULL;
|
||||
return MPI_ERR_INTERN;
|
||||
@ -71,28 +72,17 @@ int MPI_Comm_join(int fd, MPI_Comm *intercomm)
|
||||
/* Assumption: socket_send should not block, even if the socket
|
||||
is not configured to be non-blocking, because the message length are
|
||||
so short. */
|
||||
ompi_socket_send (fd, name, len);
|
||||
ompi_socket_recv (fd, rname, rlen);
|
||||
ompi_socket_send (fd, name, llen);
|
||||
ompi_socket_recv (fd, rname, lrlen);
|
||||
|
||||
port_pname = ompi_name_server.convert_string_to_process_name(rname);
|
||||
|
||||
mask = OMPI_NS_CMP_CELLID | OMPI_NS_CMP_JOBID | OMPI_NS_CMP_VPID;
|
||||
rc = ompi_name_server.compare (mask, &myproc[0]->proc_name, port_proc_name );
|
||||
if ( rc > 0 ) {
|
||||
send_first = 0;
|
||||
}
|
||||
else {
|
||||
send_first = 1;
|
||||
port_proc_name = port_pname;
|
||||
}
|
||||
|
||||
port_proc_name = ompi_name_server.convert_string_to_process_name(rname);
|
||||
rc = ompi_comm_connect_accept (MPI_COMM_SELF, 0, port_proc_name,
|
||||
send_first, &newcomp, tag);
|
||||
|
||||
|
||||
free ( name );
|
||||
free ( rname);
|
||||
free ( port_pname );
|
||||
free ( port_proc_name );
|
||||
free ( myproc );
|
||||
|
||||
*intercomm = newcomp;
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user