root/orte/mca/oob/base/base.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2005 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2005 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * Copyright (c) 2012-2013 Los Alamos National Security, LLC. All rights
  13  *                         reserved.
  14  * Copyright (c) 2017-2019 Intel, Inc.  All rights reserved.
  15  * $COPYRIGHT$
  16  *
  17  * Additional copyrights may follow
  18  *
  19  * $HEADER$
  20  */
  21 /** @file:
  22  *
  23  * the oob framework
  24  */
  25 
  26 #ifndef _MCA_OOB_BASE_H_
  27 #define _MCA_OOB_BASE_H_
  28 
  29 #include "orte_config.h"
  30 
  31 #ifdef HAVE_UNISTD_H
  32 #include <unistd.h>
  33 #endif
  34 #ifdef HAVE_SYS_UIO_H
  35 #include <sys/uio.h>
  36 #endif
  37 #ifdef HAVE_NET_UIO_H
  38 #include <net/uio.h>
  39 #endif
  40 
  41 #include "opal/class/opal_bitmap.h"
  42 #include "opal/class/opal_hash_table.h"
  43 #include "opal/class/opal_list.h"
  44 #include "opal/util/printf.h"
  45 #include "opal/util/timings.h"
  46 #include "opal/mca/event/event.h"
  47 
  48 #include "orte/mca/mca.h"
  49 #include "orte/util/threads.h"
  50 
  51 #include "orte/mca/oob/oob.h"
  52 
  53 BEGIN_C_DECLS
  54 
  55 /*
  56  * Convenience Typedef
  57  */
  58 typedef struct {
  59     opal_event_base_t *ev_base;
  60     char *include;
  61     char *exclude;
  62     opal_list_t components;
  63     opal_list_t actives;
  64     int max_uri_length;
  65     opal_hash_table_t peers;
  66     int num_threads;
  67 #if OPAL_ENABLE_TIMING
  68     bool timing;
  69 #endif
  70 } orte_oob_base_t;
  71 ORTE_DECLSPEC extern orte_oob_base_t orte_oob_base;
  72 
  73 typedef struct {
  74     opal_object_t super;
  75     mca_oob_base_component_t *component;
  76     opal_bitmap_t addressable;
  77 } orte_oob_base_peer_t;
  78 OBJ_CLASS_DECLARATION(orte_oob_base_peer_t);
  79 
  80 /* MCA framework */
  81 ORTE_DECLSPEC extern mca_base_framework_t orte_oob_base_framework;
  82 ORTE_DECLSPEC int orte_oob_base_select(void);
  83 
  84 /* Access the OOB internal functions via set of event-based macros
  85  * for inserting messages and other commands into the
  86  * OOB event base. This ensures that all OOB operations occur
  87  * asynchronously in a thread-safe environment.
  88  * Note that this doesn't mean that messages will be *sent*
  89  * in order as that depends on the specific transport being
  90  * used, when that module's event base indicates the transport
  91  * is available, etc.
  92  */
  93 typedef struct {
  94     opal_object_t super;
  95     opal_event_t ev;
  96     orte_rml_send_t *msg;
  97 } orte_oob_send_t;
  98 OBJ_CLASS_DECLARATION(orte_oob_send_t);
  99 
 100 /* All OOB sends are based on iovec's and are async as the RML
 101  * acts as the initial interface to prepare all communications.
 102  * The send_nb function will enter the message into the OOB
 103  * base, which will then check to see if a transport for the
 104  * intended target has already been assigned. If so, the message
 105  * is immediately placed into that module's event base for
 106  * transmission. If not, the function will loop across all available
 107  * components until one identifies that it has a module capable
 108  * of reaching the target.
 109  */
 110 typedef void (*mca_oob_send_callback_fn_t)(int status,
 111                                            struct iovec *iov,
 112                                            int count, void *cbdata);
 113 
 114 ORTE_DECLSPEC void orte_oob_base_send_nb(int fd, short args, void *cbdata);
 115 #define ORTE_OOB_SEND(m)                                                \
 116     do {                                                                \
 117         orte_oob_send_t *cd;                                            \
 118         opal_output_verbose(1,                                          \
 119                             orte_oob_base_framework.framework_output,   \
 120                             "%s OOB_SEND: %s:%d",                       \
 121                             ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),         \
 122                             __FILE__, __LINE__);                        \
 123         cd = OBJ_NEW(orte_oob_send_t);                                  \
 124         cd->msg = (m);                                                  \
 125         ORTE_THREADSHIFT(cd, orte_oob_base.ev_base,                     \
 126                          orte_oob_base_send_nb, ORTE_MSG_PRI);          \
 127     }while(0)
 128 
 129 /* During initial wireup, we can only transfer contact info on the daemon
 130  * command line. This limits what we can send to a string representation of
 131  * the actual contact info, which gets sent in a uri-like form. Not every
 132  * oob module can support this transaction, so this function will loop
 133  * across all oob components/modules, letting each add to the uri string if
 134  * it supports bootstrap operations. An error will be returned in the cbfunc
 135  * if NO component can successfully provide a contact.
 136  *
 137  * Note: since there is a limit to what an OS will allow on a cmd line, we
 138  * impose a limit on the length of the resulting uri via an MCA param. The
 139  * default value of -1 implies unlimited - however, users with large numbers
 140  * of interfaces on their nodes may wish to restrict the size.
 141  *
 142  * Since all components define their address info at component start,
 143  * it is unchanged and does not require acess via event
 144  */
 145 ORTE_DECLSPEC void orte_oob_base_get_addr(char **uri);
 146 
 147 #if OPAL_ENABLE_FT_CR == 1
 148 ORTE_DECLSPEC void orte_oob_base_ft_event(int fd, short args, void *cbdata);
 149 #endif
 150 
 151 END_C_DECLS
 152 #endif

/* [<][>][^][v][top][bottom][index][help] */