1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "orte_config.h"
#include "orte/orte_constants.h"
#include "orte/util/proc_info.h"
#include "orte/mca/ns/ns.h"
#include "orte/mca/oob/oob.h"
#include "orte/mca/oob/base/base.h"
int mca_oob_barrier(void)
{
orte_process_name_t* peers;
size_t i, npeers, self;
struct iovec iov;
int foo = 0;
int rc = orte_ns.get_peers(&peers,&npeers,&self);
if(rc != ORTE_SUCCESS) {
return rc;
}
iov.iov_base = (void*)&foo;
iov.iov_len = sizeof(foo);
/* All non-root send & receive zero-length message. */
if (0 < self) {
int tag=-1;
rc = mca_oob_send(&peers[0],&iov,1,tag,0);
if (rc < 0) {
return rc;
}
rc = mca_oob_recv(&peers[0],&iov,1,tag,0);
if (rc < 0) {
return rc;
}
}
/* The root collects and broadcasts the messages. */
else {
int tag=-1;
for (i = 1; i < npeers; i++) {
rc = mca_oob_recv(&peers[i],&iov,1,tag,0);
if (rc < 0) {
return rc;
}
}
for (i = 1; i < npeers; i++) {
rc = mca_oob_send(&peers[i],&iov,1,tag,0);
if (rc < 0) {
return rc;
}
}
}
return ORTE_SUCCESS;
}
|