root/opal/mca/pmix/pmix4x/pmix/src/mca/base/pmix_mca_base_framework.c

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

DEFINITIONS

This source file includes following definitions.
  1. pmix_mca_base_framework_is_registered
  2. pmix_mca_base_framework_is_open
  3. framework_open_output
  4. framework_close_output
  5. pmix_mca_base_framework_register
  6. pmix_mca_base_framework_open
  7. pmix_mca_base_framework_close

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
   4  *                         reserved.
   5  * Copyright (c) 2015      Cisco Systems, Inc.  All rights reserved.
   6  * Copyright (c) 2016-2017 Intel, Inc. All rights reserved.
   7  * $COPYRIGHT$
   8  *
   9  * Additional copyrights may follow
  10  *
  11  * $HEADER$
  12  */
  13 
  14 #include <src/include/pmix_config.h>
  15 
  16 #include "pmix_common.h"
  17 #include "src/util/output.h"
  18 
  19 #include "pmix_mca_base_framework.h"
  20 #include "pmix_mca_base_var.h"
  21 #include "src/mca/base/base.h"
  22 
  23 bool pmix_mca_base_framework_is_registered (struct pmix_mca_base_framework_t *framework)
  24 {
  25     return !!(framework->framework_flags & PMIX_MCA_BASE_FRAMEWORK_FLAG_REGISTERED);
  26 }
  27 
  28 bool pmix_mca_base_framework_is_open (struct pmix_mca_base_framework_t *framework)
  29 {
  30     return !!(framework->framework_flags & PMIX_MCA_BASE_FRAMEWORK_FLAG_OPEN);
  31 }
  32 
  33 static void framework_open_output (struct pmix_mca_base_framework_t *framework)
  34 {
  35     if (0 < framework->framework_verbose) {
  36         if (-1 == framework->framework_output) {
  37             framework->framework_output = pmix_output_open (NULL);
  38         }
  39         pmix_output_set_verbosity(framework->framework_output,
  40                                   framework->framework_verbose);
  41     } else if (-1 != framework->framework_output) {
  42         pmix_output_close (framework->framework_output);
  43         framework->framework_output = -1;
  44     }
  45 }
  46 
  47 static void framework_close_output (struct pmix_mca_base_framework_t *framework)
  48 {
  49     if (-1 != framework->framework_output) {
  50         pmix_output_close (framework->framework_output);
  51         framework->framework_output = -1;
  52     }
  53 }
  54 
  55 int pmix_mca_base_framework_register (struct pmix_mca_base_framework_t *framework,
  56                                  pmix_mca_base_register_flag_t flags)
  57 {
  58     char *desc;
  59     int ret;
  60 
  61     assert (NULL != framework);
  62 
  63     framework->framework_refcnt++;
  64 
  65     if (pmix_mca_base_framework_is_registered (framework)) {
  66         return PMIX_SUCCESS;
  67     }
  68 
  69     PMIX_CONSTRUCT(&framework->framework_components, pmix_list_t);
  70     PMIX_CONSTRUCT(&framework->framework_failed_components, pmix_list_t);
  71 
  72     if (framework->framework_flags & PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO) {
  73         flags |= PMIX_MCA_BASE_REGISTER_STATIC_ONLY;
  74     }
  75 
  76     if (!(PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER & framework->framework_flags)) {
  77         /* register this framework with the MCA variable system */
  78         ret = pmix_mca_base_var_group_register (framework->framework_project,
  79                                            framework->framework_name,
  80                                            NULL, framework->framework_description);
  81         if (0 > ret) {
  82             return ret;
  83         }
  84 
  85         ret = asprintf (&desc, "Default selection set of components for the %s framework (<none>"
  86                         " means use all components that can be found)", framework->framework_name);
  87         if (0 > ret) {
  88             return PMIX_ERR_OUT_OF_RESOURCE;
  89         }
  90 
  91         ret = pmix_mca_base_var_register (framework->framework_project, framework->framework_name,
  92                                      NULL, NULL, desc, PMIX_MCA_BASE_VAR_TYPE_STRING, NULL, 0,
  93                                      PMIX_MCA_BASE_VAR_FLAG_SETTABLE, PMIX_INFO_LVL_2,
  94                                      PMIX_MCA_BASE_VAR_SCOPE_ALL_EQ, &framework->framework_selection);
  95         free (desc);
  96         if (0 > ret) {
  97             return ret;
  98         }
  99 
 100         /* register a verbosity variable for this framework */
 101         ret = asprintf (&desc, "Verbosity level for the %s framework (default: 0)",
 102                         framework->framework_name);
 103         if (0 > ret) {
 104             return PMIX_ERR_OUT_OF_RESOURCE;
 105         }
 106 
 107         framework->framework_verbose = PMIX_MCA_BASE_VERBOSE_ERROR;
 108         ret = pmix_mca_base_framework_var_register (framework, "verbose", desc,
 109                                                PMIX_MCA_BASE_VAR_TYPE_INT,
 110                                                &pmix_mca_base_var_enum_verbose, 0,
 111                                                PMIX_MCA_BASE_VAR_FLAG_SETTABLE,
 112                                                PMIX_INFO_LVL_8,
 113                                                PMIX_MCA_BASE_VAR_SCOPE_LOCAL,
 114                                                &framework->framework_verbose);
 115         free(desc);
 116         if (0 > ret) {
 117             return ret;
 118         }
 119 
 120         /* check the initial verbosity and open the output if necessary. we
 121            will recheck this on open */
 122         framework_open_output (framework);
 123 
 124         /* register framework variables */
 125         if (NULL != framework->framework_register) {
 126             ret = framework->framework_register (flags);
 127             if (PMIX_SUCCESS != ret) {
 128                 return ret;
 129             }
 130         }
 131 
 132         /* register components variables */
 133         ret = pmix_mca_base_framework_components_register (framework, flags);
 134         if (PMIX_SUCCESS != ret) {
 135             return ret;
 136         }
 137     }
 138 
 139     framework->framework_flags |= PMIX_MCA_BASE_FRAMEWORK_FLAG_REGISTERED;
 140 
 141     /* framework did not provide a register function */
 142     return PMIX_SUCCESS;
 143 }
 144 
 145 int pmix_mca_base_framework_open (struct pmix_mca_base_framework_t *framework,
 146                              pmix_mca_base_open_flag_t flags) {
 147     int ret;
 148 
 149     assert (NULL != framework);
 150 
 151     /* register this framework before opening it */
 152     ret = pmix_mca_base_framework_register (framework, PMIX_MCA_BASE_REGISTER_DEFAULT);
 153     if (PMIX_SUCCESS != ret) {
 154         return ret;
 155     }
 156 
 157     /* check if this framework is already open */
 158     if (pmix_mca_base_framework_is_open (framework)) {
 159         return PMIX_SUCCESS;
 160     }
 161 
 162     if (PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER & framework->framework_flags) {
 163         flags |= PMIX_MCA_BASE_OPEN_FIND_COMPONENTS;
 164 
 165         if (PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO & framework->framework_flags) {
 166             flags |= PMIX_MCA_BASE_OPEN_STATIC_ONLY;
 167         }
 168     }
 169 
 170     /* lock all of this frameworks's variables */
 171     ret = pmix_mca_base_var_group_find (framework->framework_project,
 172                                    framework->framework_name,
 173                                    NULL);
 174     pmix_mca_base_var_group_set_var_flag (ret, PMIX_MCA_BASE_VAR_FLAG_SETTABLE, false);
 175 
 176     /* check the verbosity level and open (or close) the output */
 177     framework_open_output (framework);
 178 
 179     if (NULL != framework->framework_open) {
 180         ret = framework->framework_open (flags);
 181     } else {
 182         ret = pmix_mca_base_framework_components_open (framework, flags);
 183     }
 184 
 185     if (PMIX_SUCCESS != ret) {
 186         framework->framework_refcnt--;
 187     } else {
 188         framework->framework_flags |= PMIX_MCA_BASE_FRAMEWORK_FLAG_OPEN;
 189     }
 190 
 191     return ret;
 192 }
 193 
 194 int pmix_mca_base_framework_close (struct pmix_mca_base_framework_t *framework) {
 195     bool is_open = pmix_mca_base_framework_is_open (framework);
 196     bool is_registered = pmix_mca_base_framework_is_registered (framework);
 197     int ret, group_id;
 198 
 199     assert (NULL != framework);
 200 
 201     if (!(is_open || is_registered)) {
 202         return PMIX_SUCCESS;
 203     }
 204 
 205     assert (framework->framework_refcnt);
 206     if (--framework->framework_refcnt) {
 207         return PMIX_SUCCESS;
 208     }
 209 
 210     /* find and deregister all component groups and variables */
 211     group_id = pmix_mca_base_var_group_find (framework->framework_project,
 212                                         framework->framework_name, NULL);
 213     if (0 <= group_id) {
 214         (void) pmix_mca_base_var_group_deregister (group_id);
 215     }
 216 
 217     /* close the framework and all of its components */
 218     if (is_open) {
 219         if (NULL != framework->framework_close) {
 220             ret = framework->framework_close ();
 221         } else {
 222             ret = pmix_mca_base_framework_components_close (framework, NULL);
 223         }
 224 
 225         if (PMIX_SUCCESS != ret) {
 226             return ret;
 227         }
 228     } else {
 229         pmix_list_item_t *item;
 230         while (NULL != (item = pmix_list_remove_first (&framework->framework_components))) {
 231             pmix_mca_base_component_list_item_t *cli;
 232             cli = (pmix_mca_base_component_list_item_t*) item;
 233             pmix_mca_base_component_unload(cli->cli_component,
 234                                            framework->framework_output);
 235             PMIX_RELEASE(item);
 236         }
 237         ret = PMIX_SUCCESS;
 238     }
 239 
 240     framework->framework_flags &= ~(PMIX_MCA_BASE_FRAMEWORK_FLAG_REGISTERED | PMIX_MCA_BASE_FRAMEWORK_FLAG_OPEN);
 241 
 242     PMIX_DESTRUCT(&framework->framework_components);
 243     PMIX_LIST_DESTRUCT(&framework->framework_failed_components);
 244 
 245     framework_close_output (framework);
 246 
 247     return ret;
 248 }

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