root/opal/mca/base/mca_base_var.h

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

INCLUDED FROM


   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2006 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2008-2011 Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2012-2018 Los Alamos National Security, LLC. All rights
  15  *                         reserved.
  16  * Copyright (c) 2016      Intel, Inc. All rights reserved.
  17  * Copyright (c) 2017      IBM Corporation. All rights reserved.
  18  * Copyright (c) 2018      Triad National Security, LLC. All rights
  19  *                         reserved.
  20  * $COPYRIGHT$
  21  *
  22  * Additional copyrights may follow
  23  *
  24  * $HEADER$
  25  */
  26 
  27 /** @file
  28  * This file presents the MCA variable interface.
  29  *
  30  * Note that there are two scopes for MCA variables: "normal" and
  31  * attributes.  Specifically, all MCA variables are "normal" -- some
  32  * are special and may also be found on attributes on communicators,
  33  * datatypes, or windows.
  34  *
  35  * In general, these functions are intended to be used as follows:
  36  *
  37  * - Creating MCA variables
  38  * -# Register a variable, get an index back
  39  * - Using MCA variables
  40  * -# Lookup a "normal" variable value on a specific index, or
  41  * -# Lookup an attribute variable on a specific index and
  42  *    communicator / datatype / window.
  43  *
  44  * MCA variables can be defined in multiple different places.  As
  45  * such, variables are \em resolved to find their value.  The order
  46  * of resolution is as follows:
  47  *
  48  * - An "override" location that is only available to be set via the
  49  *   mca_base_param API.
  50  * - Look for an environment variable corresponding to the MCA
  51  *   variable.
  52  * - See if a file contains the MCA variable (MCA variable files are
  53  *   read only once -- when the first time any mca_param_t function is
  54  *   invoked).
  55  * - If nothing else was found, use the variable's default value.
  56  *
  57  * Note that there is a second header file (mca_base_vari.h)
  58  * that contains several internal type delcarations for the variable
  59  * system.  The internal file is only used within the variable system
  60  * itself; it should not be required by any other Open MPI entities.
  61  */
  62 
  63 #ifndef OPAL_MCA_BASE_VAR_H
  64 #define OPAL_MCA_BASE_VAR_H
  65 
  66 #include "opal_config.h"
  67 
  68 #include "opal/class/opal_list.h"
  69 #include "opal/class/opal_value_array.h"
  70 #include "opal/mca/base/mca_base_var_enum.h"
  71 #include "opal/mca/base/mca_base_var_group.h"
  72 #include "opal/mca/base/mca_base_framework.h"
  73 #include "opal/mca/mca.h"
  74 
  75 /**
  76  * The types of MCA variables.
  77  */
  78 typedef enum {
  79     /** The variable is of type int. */
  80     MCA_BASE_VAR_TYPE_INT,
  81     /** The variable is of type unsigned int */
  82     MCA_BASE_VAR_TYPE_UNSIGNED_INT,
  83     /** The variable is of type unsigned long */
  84     MCA_BASE_VAR_TYPE_UNSIGNED_LONG,
  85     /** The variable is of type unsigned long long */
  86     MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG,
  87     /** The variable is of type size_t */
  88     MCA_BASE_VAR_TYPE_SIZE_T,
  89     /** The variable is of type string. */
  90     MCA_BASE_VAR_TYPE_STRING,
  91     /** The variable is of type string and contains version. */
  92     MCA_BASE_VAR_TYPE_VERSION_STRING,
  93     /** The variable is of type bool */
  94     MCA_BASE_VAR_TYPE_BOOL,
  95     /** The variable is of type double */
  96     MCA_BASE_VAR_TYPE_DOUBLE,
  97     /** The variable is of type long int */
  98     MCA_BASE_VAR_TYPE_LONG,
  99     /** The variable is of type int32_t */
 100     MCA_BASE_VAR_TYPE_INT32_T,
 101     /** The variable is of type uint32_t */
 102     MCA_BASE_VAR_TYPE_UINT32_T,
 103     /** The variable is of type int64_t */
 104     MCA_BASE_VAR_TYPE_INT64_T,
 105     /** The variable is of type uint64_t */
 106     MCA_BASE_VAR_TYPE_UINT64_T,
 107 
 108     /** Maximum variable type. */
 109     MCA_BASE_VAR_TYPE_MAX
 110 } mca_base_var_type_t;
 111 
 112 extern const char *ompi_var_type_names[];
 113 
 114 /**
 115  * Source of an MCA variable's value
 116  */
 117 typedef enum {
 118     /** The default value */
 119     MCA_BASE_VAR_SOURCE_DEFAULT,
 120     /** The value came from the command line */
 121     MCA_BASE_VAR_SOURCE_COMMAND_LINE,
 122     /** The value came from the environment */
 123     MCA_BASE_VAR_SOURCE_ENV,
 124     /** The value came from a file */
 125     MCA_BASE_VAR_SOURCE_FILE,
 126     /** The value came a "set" API call */
 127     MCA_BASE_VAR_SOURCE_SET,
 128     /** The value came from the override file */
 129     MCA_BASE_VAR_SOURCE_OVERRIDE,
 130 
 131     /** Maximum source type */
 132     MCA_BASE_VAR_SOURCE_MAX
 133 } mca_base_var_source_t;
 134 
 135 /**
 136  * MCA variable scopes
 137  *
 138  * Equivalent to MPI_T scopes with the same base name (e.g.,
 139  * MCA_BASE_VAR_SCOPE_CONSTANT corresponts to MPI_T_SCOPE_CONSTANT).
 140  */
 141 typedef enum {
 142     /** The value of this variable will not change after it is
 143         registered.  This flag is incompatible with
 144         MCA_BASE_VAR_FLAG_SETTABLE, and also implies
 145         MCA_BASE_VAR_SCOPE_READONLY. */
 146     MCA_BASE_VAR_SCOPE_CONSTANT,
 147     /** Setting the READONLY flag means that the mca_base_var_set()
 148         function cannot be used to set the value of this variable
 149         (e.g., the MPI_T_cvar_write() MPI_T function). */
 150     MCA_BASE_VAR_SCOPE_READONLY,
 151     /** The value of this variable may be changed locally. */
 152     MCA_BASE_VAR_SCOPE_LOCAL,
 153     /** The value of this variable must be set to a consistent value
 154         within a group */
 155     MCA_BASE_VAR_SCOPE_GROUP,
 156     /** The value of this variable must be set to the same value
 157         within a group */
 158     MCA_BASE_VAR_SCOPE_GROUP_EQ,
 159     /** The value of this variable must be set to a consistent value
 160         for all processes */
 161     MCA_BASE_VAR_SCOPE_ALL,
 162     /** The value of this variable must be set to the same value
 163         for all processes */
 164     MCA_BASE_VAR_SCOPE_ALL_EQ,
 165     MCA_BASE_VAR_SCOPE_MAX
 166 } mca_base_var_scope_t;
 167 
 168 typedef enum {
 169     OPAL_INFO_LVL_1,
 170     OPAL_INFO_LVL_2,
 171     OPAL_INFO_LVL_3,
 172     OPAL_INFO_LVL_4,
 173     OPAL_INFO_LVL_5,
 174     OPAL_INFO_LVL_6,
 175     OPAL_INFO_LVL_7,
 176     OPAL_INFO_LVL_8,
 177     OPAL_INFO_LVL_9,
 178     OPAL_INFO_LVL_MAX
 179 } mca_base_var_info_lvl_t;
 180 
 181 typedef enum {
 182     MCA_BASE_VAR_SYN_FLAG_DEPRECATED = 0x0001,
 183     MCA_BASE_VAR_SYN_FLAG_INTERNAL   = 0x0002
 184 } mca_base_var_syn_flag_t;
 185 
 186 typedef enum {
 187     /** Variable is internal (hidden from *_info/MPIT) */
 188     MCA_BASE_VAR_FLAG_INTERNAL     = 0x0001,
 189     /** Variable will always be the default value. Implies
 190         !MCA_BASE_VAR_FLAG_SETTABLE */
 191     MCA_BASE_VAR_FLAG_DEFAULT_ONLY = 0x0002,
 192     /** Variable can be set with mca_base_var_set() */
 193     MCA_BASE_VAR_FLAG_SETTABLE     = 0x0004,
 194     /** Variable is deprecated */
 195     MCA_BASE_VAR_FLAG_DEPRECATED   = 0x0008,
 196     /** Variable has been overridden */
 197     MCA_BASE_VAR_FLAG_OVERRIDE     = 0x0010,
 198     /** Variable may not be set from a file */
 199     MCA_BASE_VAR_FLAG_ENVIRONMENT_ONLY = 0x0020,
 200     /** Variable should be deregistered when the group is deregistered
 201         (DWG = "deregister with group").  This flag is set
 202         automatically when you register a variable with
 203         mca_base_component_var_register(), but can also be set
 204         manually when you register a variable with
 205         mca_base_var_register().  Analogous to the
 206         MCA_BASE_PVAR_FLAG_IWG. */
 207     MCA_BASE_VAR_FLAG_DWG          = 0x0040,
 208     /** Variable has a default value of "unset". Meaning to only
 209      * be set when the user explicitly asks for it */
 210     MCA_BASE_VAR_FLAG_DEF_UNSET    = 0x0080,
 211 } mca_base_var_flag_t;
 212 
 213 
 214 /**
 215  * Types for MCA parameters.
 216  */
 217 typedef union {
 218     /** integer value */
 219     int intval;
 220     /** int32_t value */
 221     int32_t int32tval;
 222     /** long value */
 223     long longval;
 224     /** int64_t value */
 225     int64_t int64tval;
 226     /** unsigned int value */
 227     unsigned int uintval;
 228     /** uint32_t value */
 229     uint32_t uint32tval;
 230     /** string value */
 231     char *stringval;
 232     /** boolean value */
 233     bool boolval;
 234     /** unsigned long value */
 235     unsigned long ulval;
 236     /** uint64_t value */
 237     uint64_t uint64tval;
 238     /** unsigned long long value */
 239     unsigned long long ullval;
 240     /** size_t value */
 241     size_t sizetval;
 242     /** double value */
 243     double lfval;
 244 } mca_base_var_storage_t;
 245 
 246 
 247 /**
 248  * Entry for holding information about an MCA variable.
 249  */
 250 struct mca_base_var_t {
 251     /** Allow this to be an OPAL OBJ */
 252     opal_object_t super;
 253 
 254     /** Variable index. This will remain constant until mca_base_var_finalize()
 255         is called. */
 256     int mbv_index;
 257     /** Group index. This will remain constant until mca_base_var_finalize()
 258         is called. This variable will be deregistered if the associated group
 259         is deregistered with mca_base_var_group_deregister() */
 260     int mbv_group_index;
 261 
 262     /** Info level of this variable */
 263     mca_base_var_info_lvl_t mbv_info_lvl;
 264 
 265     /** Enum indicating the type of the variable (integer, string, boolean) */
 266      mca_base_var_type_t mbv_type;
 267 
 268     /** String of the variable name */
 269     char *mbv_variable_name;
 270     /** Full variable name, in case it is not <framework>_<component>_<param> */
 271     char *mbv_full_name;
 272     /** Long variable name <project>_<framework>_<component>_<name> */
 273     char *mbv_long_name;
 274 
 275     /** List of synonym names for this variable.  This *must* be a
 276         pointer (vs. a plain opal_list_t) because we copy this whole
 277         struct into a new var for permanent storage
 278         (opal_vale_array_append_item()), and the internal pointers in
 279         the opal_list_t will be invalid when that happens.  Hence, we
 280         simply keep a pointer to an external opal_list_t.  Synonyms
 281         are uncommon enough that this is not a big performance hit. */
 282     opal_value_array_t mbv_synonyms;
 283 
 284     /** Variable flags */
 285     mca_base_var_flag_t  mbv_flags;
 286 
 287     /** Variable scope */
 288     mca_base_var_scope_t  mbv_scope;
 289 
 290     /** Source of the current value */
 291     mca_base_var_source_t mbv_source;
 292 
 293     /** Synonym for */
 294     int mbv_synonym_for;
 295 
 296     /** Variable description */
 297     char *mbv_description;
 298 
 299     /** File the value came from */
 300     char *mbv_source_file;
 301 
 302     /** Value enumerator (only valid for integer variables) */
 303     mca_base_var_enum_t *mbv_enumerator;
 304 
 305     /** Bind value for this variable (0 - none) */
 306     int mbv_bind;
 307 
 308     /** Storage for this variable */
 309     mca_base_var_storage_t *mbv_storage;
 310 
 311     /** File value structure */
 312     void *mbv_file_value;
 313 };
 314 /**
 315  * Convenience typedef.
 316  */
 317 typedef struct mca_base_var_t mca_base_var_t;
 318 
 319 /*
 320  * Global functions for MCA
 321  */
 322 
 323 BEGIN_C_DECLS
 324 
 325 /**
 326  * Object declarayion for mca_base_var_t
 327  */
 328 OPAL_DECLSPEC OBJ_CLASS_DECLARATION(mca_base_var_t);
 329 
 330 /**
 331  * Initialize the MCA variable system.
 332  *
 333  * @retval OPAL_SUCCESS
 334  *
 335  * This function initalizes the MCA variable system.  It is
 336  * invoked internally (by mca_base_open()) and is only documented
 337  * here for completeness.
 338  */
 339 OPAL_DECLSPEC int mca_base_var_init(void);
 340 
 341 /**
 342  * Register an MCA variable
 343  *
 344  * @param[in] project_name The name of the project associated with
 345  * this variable
 346  * @param[in] framework_name The name of the framework associated with
 347  * this variable
 348  * @param[in] component_name The name of the component associated with
 349  * this variable
 350  * @param[in] variable_name The name of this variable
 351  * @param[in] description A string describing the use and valid
 352  * values of the variable (string).
 353  * @param[in] type The type of this variable (string, int, bool).
 354  * @param[in] enumerator Enumerator describing valid values.
 355  * @param[in] bind Hint for MPIT to specify type of binding (0 = none)
 356  * @param[in] flags Flags for this variable.
 357  * @param[in] info_lvl Info level of this variable
 358  * @param[in] scope Indicates the scope of this variable
 359  * @param[in,out] storage Pointer to the value's location.
 360  *
 361  * @retval index Index value representing this variable.
 362  * @retval OPAL_ERR_OUT_OF_RESOURCE Upon failure to allocate memory.
 363  * @retval OPAL_ERROR Upon failure to register the variable.
 364  *
 365  * This function registers an MCA variable and associates it
 366  * with a specific group.
 367  *
 368  * {description} is a string of arbitrary length (verbose is good!)
 369  * for explaining what the variable is for and what its valid values
 370  * are.  This message is used in help messages, such as the output
 371  * from the ompi_info executable.  The {description} string is copied
 372  * internally; the caller can free {description} upon successful
 373  * return.
 374  *
 375  * {enumerator} is either NULL or a handle that was created via
 376  * mca_base_var_enum_create(), and describes the valid values of an
 377  * integer variable (i.e., one with type MCA_BASE_VAR_TYPE_INT).  When
 378  * a non-NULL {enumerator} is used, the value set for this variable by
 379  * the user will be compared against the values in the enumerator.
 380  * The MCA variable system will allow the parameter to be set to
 381  * either one of the enumerator values (0, 1, 2, etc) or a string
 382  * representing one of those values.  {enumerator} is retained until
 383  * either the variable is deregistered using
 384  * mca_base_var_deregister(), mca_base_var_group_deregister(), or
 385  * mca_base_var_finalize().  {enumerator} should be NULL for
 386  * parameters that do not support enumerated values.
 387  *
 388  * {flags} indicate attributes of this variable (internal, settable,
 389  * default only, etc.), as listed below.
 390  *
 391  * If MCA_BASE_VAR_FLAG_SETTABLE is set in {flags}, this variable may
 392  * be set using mca_base_var_set_value() (i.e., the MPI_T interface).
 393  *
 394  * If MCA_BASE_VAR_FLAG_INTERNAL is set in {flags}, this variable
 395  * is not shown by default in the output of ompi_info.  That is,
 396  * this variable is considered internal to the Open MPI implementation
 397  * and is not supposed to be viewed / changed by the user.
 398  *
 399  * If MCA_BASE_VAR_FLAG_DEFAULT_ONLY is set in {flags}, then the value
 400  * provided in storage will not be modified by the MCA variable system
 401  * (i.e., users cannot set the value of this variable via CLI
 402  * parameter, environment variable, file, etc.). It is up to the
 403  * caller to specify (using the scope) if this value may change
 404  * (MCA_BASE_VAR_SCOPE_READONLY) or remain constant
 405  * (MCA_BASE_VAR_SCOPE_CONSTANT).  MCA_BASE_VAR_FLAG_DEFAULT_ONLY must
 406  * not be specified with MCA_BASE_VAR_FLAG_SETTABLE.
 407  *
 408  * Set MCA_BASE_VAR_FLAG_DEPRECATED in {flags} to indicate that
 409  * this variable name is deprecated. The user will get a warning
 410  * if they set this variable.
 411  *
 412  * {scope} is for informational purposes to indicate how this variable
 413  * can be set, or if it is considered constant or readonly (which, by
 414  * MPI_T's definitions, are different things).  See the comments in
 415  * the description of mca_base_var_scope_t for information about the
 416  * different scope meanings.
 417  *
 418  * {storage} points to a (char *), (int), or (bool) where the value of
 419  * this variable is stored ({type} indicates the type of this
 420  * pointer).  The location pointed to by {storage} must exist until
 421  * the variable is deregistered.  Note that the initial value in
 422  * {storage} may be overwritten if the MCA_BASE_VAR_FLAG_DEFAULT_ONLY
 423  * flag is not set (e.g., if the user sets this variable via CLI
 424  * option, environment variable, or file value).  If input value of
 425  * {storage} points to a (char *), the pointed-to string will be
 426  * duplicated and maintained internally by the MCA variable system;
 427  * the caller may free the original string after this function returns
 428  * successfully.
 429  */
 430 OPAL_DECLSPEC int mca_base_var_register (const char *project_name, const char *framework_name,
 431                                          const char *component_name, const char *variable_name,
 432                                          const char *description, mca_base_var_type_t type,
 433                                          mca_base_var_enum_t *enumerator, int bind, mca_base_var_flag_t flags,
 434                                          mca_base_var_info_lvl_t info_lvl,
 435                                          mca_base_var_scope_t scope, void *storage);
 436 
 437 /**
 438  * Convenience function for registering a variable associated with a
 439  * component.
 440  *
 441  * While quite similar to mca_base_var_register(), there is one key
 442  * difference: vars registered this this function will automatically
 443  * be unregistered / made unavailable when that component is closed by
 444  * its framework.
 445  */
 446 OPAL_DECLSPEC int mca_base_component_var_register (const mca_base_component_t *component,
 447                                                    const char *variable_name, const char *description,
 448                                                    mca_base_var_type_t type, mca_base_var_enum_t *enumerator,
 449                                                    int bind, mca_base_var_flag_t flags,
 450                                                    mca_base_var_info_lvl_t info_lvl,
 451                                                    mca_base_var_scope_t scope, void *storage);
 452 
 453 /**
 454  * Convenience function for registering a variable associated with a framework. This
 455  * function is equivalent to mca_base_var_register with component_name = "base" and
 456  * with the MCA_BASE_VAR_FLAG_DWG set. See mca_base_var_register().
 457  */
 458 OPAL_DECLSPEC int mca_base_framework_var_register (const mca_base_framework_t *framework,
 459                                      const char *variable_name,
 460                                      const char *help_msg, mca_base_var_type_t type,
 461                                      mca_base_var_enum_t *enumerator, int bind,
 462                                      mca_base_var_flag_t flags,
 463                                      mca_base_var_info_lvl_t info_level,
 464                                      mca_base_var_scope_t scope, void *storage);
 465 
 466 /**
 467  * Register a synonym name for an MCA variable.
 468  *
 469  * @param[in] synonym_for The index of the original variable. This index
 470  * must not refer to a synonym.
 471  * @param[in] project_name The project this synonym belongs to. Should
 472  * not be NULL (except for legacy reasons).
 473  * @param[in] framework_name The framework this synonym belongs to.
 474  * @param[in] component_name The component this synonym belongs to.
 475  * @param[in] synonym_name The synonym name.
 476  * @param[in] flags Flags for this synonym.
 477  *
 478  * @returns index Variable index for new synonym on success.
 479  * @returns OPAL_ERR_BAD_VAR If synonym_for does not reference a valid
 480  * variable.
 481  * @returns OPAL_ERR_OUT_OF_RESOURCE If memory could not be allocated.
 482  * @returns OPAL_ERROR For all other errors.
 483  *
 484  * Upon success, this function creates a synonym MCA variable
 485  * that will be treated almost exactly like the original.  The
 486  * type (int or string) is irrelevant; this function simply
 487  * creates a new name that by which the same variable value is
 488  * accessible.
 489  *
 490  * Note that the original variable name has precendence over all
 491  * synonyms.  For example, consider the case if variable is
 492  * originally registered under the name "A" and is later
 493  * registered with synonyms "B" and "C".  If the user sets values
 494  * for both MCA variable names "A" and "B", the value associated
 495  * with the "A" name will be used and the value associated with
 496  * the "B" will be ignored (and will not even be visible by the
 497  * mca_base_var_*() API).  If the user sets values for both MCA
 498  * variable names "B" and "C" (and does *not* set a value for
 499  * "A"), it is undefined as to which value will be used.
 500  */
 501 OPAL_DECLSPEC int mca_base_var_register_synonym (int synonym_for, const char *project_name,
 502                                                  const char *framework_name,
 503                                                  const char *component_name,
 504                                                  const char *synonym_name,
 505                                                  mca_base_var_syn_flag_t flags);
 506 
 507 /**
 508  * Deregister a MCA variable or synonym
 509  *
 510  * @param vari Index returned from mca_base_var_register() or
 511  * mca_base_var_register_synonym().
 512  *
 513  * Deregistering a variable does not free the variable or any memory assoicated
 514  * with it. All memory will be freed and the variable index released when
 515  * mca_base_var_finalize() is called.
 516  *
 517  * If an enumerator is associated with this variable it will be dereferenced.
 518  */
 519 OPAL_DECLSPEC int mca_base_var_deregister(int vari);
 520 
 521 
 522 /**
 523  * Get the current value of an MCA variable.
 524  *
 525  * @param[in] vari Index of variable
 526  * @param[in,out] value Pointer to copy the value to. Can be NULL.
 527  * @param[out] source Source of current value. Can be NULL.
 528  * @param[out] source_file Source file for the current value if
 529  * it was set from a file.
 530  *
 531  * @return OPAL_ERROR Upon failure.  The contents of value are
 532  * undefined.
 533  * @return OPAL_SUCCESS Upon success. value (if not NULL) will be filled
 534  * with the variable's current value. value_size will contain the size
 535  * copied. source (if not NULL) will contain the source of the variable.
 536  *
 537  * Note: The value can be changed by the registering code without using
 538  * the mca_base_var_* interface so the source may be incorrect.
 539  */
 540 OPAL_DECLSPEC int mca_base_var_get_value (int vari, const void *value,
 541                                           mca_base_var_source_t *source,
 542                                           const char **source_file);
 543 
 544 /**
 545  * Sets an "override" value for an integer MCA variable.
 546  *
 547  * @param[in] vari Index of MCA variable to set
 548  * @param[in] value Pointer to the value to set. Should point to
 549  * a char * for string variables or a int * for integer variables.
 550  * @param[in] size Size of value.
 551  * @param[in] source Source of this value.
 552  * @param[in] source_file Source file if source is MCA_BASE_VAR_SOURCE_FILE.
 553  *
 554  * @retval OPAL_SUCCESS  Upon success.
 555  * @retval OPAL_ERR_PERM If the variable is not settable.
 556  * @retval OPAL_ERR_BAD_PARAM If the variable does not exist or has
 557  * been deregistered.
 558  * @retval OPAL_ERROR On other error.
 559  *
 560  * This function sets the value of an MCA variable. This value will
 561  * overwrite the current value of the variable (or if index represents
 562  * a synonym the variable the synonym represents) if the value is
 563  * settable.
 564  */
 565 OPAL_DECLSPEC int mca_base_var_set_value (int vari, const void *value, size_t size,
 566                                           mca_base_var_source_t source,
 567                                           const char *source_file);
 568 
 569 /**
 570  * Get the string name corresponding to the MCA variable
 571  * value in the environment.
 572  *
 573  * @param param_name Name of the type containing the variable.
 574  *
 575  * @retval string A string suitable for setenv() or appending to
 576  * an environ-style string array.
 577  * @retval NULL Upon failure.
 578  *
 579  * The string that is returned is owned by the caller; if
 580  * appropriate, it must be eventually freed by the caller.
 581  */
 582 OPAL_DECLSPEC int mca_base_var_env_name(const char *param_name,
 583                                         char **env_name);
 584 
 585 /**
 586  * Find the index for an MCA variable based on its names.
 587  *
 588  * @param project_name   Name of the project
 589  * @param type_name      Name of the type containing the variable.
 590  * @param component_name Name of the component containing the variable.
 591  * @param param_name     Name of the variable.
 592  *
 593  * @retval OPAL_ERROR If the variable was not found.
 594  * @retval vari If the variable was found.
 595  *
 596  * It is not always convenient to widely propagate a variable's index
 597  * value, or it may be necessary to look up the variable from a
 598  * different component. This function can be used to look up the index
 599  * of any registered variable.  The returned index can be used with
 600  * mca_base_var_get() and mca_base_var_get_value().
 601  */
 602 OPAL_DECLSPEC int mca_base_var_find (const char *project_name,
 603                                      const char *type_name,
 604                                      const char *component_name,
 605                                      const char *param_name);
 606 
 607 /**
 608  * Find the index for a variable based on its full name
 609  *
 610  * @param full_name [in] Full name of the variable
 611  * @param vari [out]    Index of the variable
 612  *
 613  * See mca_base_var_find().
 614  */
 615 OPAL_DECLSPEC int mca_base_var_find_by_name (const char *full_name, int *vari);
 616 
 617 /**
 618  * Check that two MCA variables were not both set to non-default
 619  * values.
 620  *
 621  * @param type_a [in] Framework name of variable A (string).
 622  * @param component_a [in] Component name of variable A (string).
 623  * @param param_a [in] Variable name of variable A (string.
 624  * @param type_b [in] Framework name of variable A (string).
 625  * @param component_b [in] Component name of variable A (string).
 626  * @param param_b [in] Variable name of variable A (string.
 627  *
 628  * This function is useful for checking that the user did not set both
 629  * of 2 mutually-exclusive MCA variables.
 630  *
 631  * This function will print an opal_show_help() message and return
 632  * OPAL_ERR_BAD_VAR if it finds that the two variables both have
 633  * value sources that are not MCA_BASE_VAR_SOURCE_DEFAULT.  This
 634  * means that both variables have been set by the user (i.e., they're
 635  * not default values).
 636  *
 637  * Note that opal_show_help() allows itself to be hooked, so if this
 638  * happens after the aggregated opal_show_help() system is
 639  * initialized, the messages will be aggregated (w00t).
 640  *
 641  * @returns OPAL_ERR_BAD_VAR if the two variables have sources that
 642  * are not MCA_BASE_VAR_SOURCE_DEFAULT.
 643  * @returns OPAL_SUCCESS otherwise.
 644  */
 645 OPAL_DECLSPEC int mca_base_var_check_exclusive (const char *project,
 646                                                 const char *type_a,
 647                                                 const char *component_a,
 648                                                 const char *param_a,
 649                                                 const char *type_b,
 650                                                 const char *component_b,
 651                                                 const char *param_b);
 652 
 653 /**
 654  * Set or unset a flag on a variable.
 655  *
 656  * @param[in] vari Index of variable
 657  * @param[in] flag Flag(s) to set or unset.
 658  * @param[in] set Boolean indicating whether to set flag(s).
 659  *
 660  * @returns OPAL_SUCCESS If the flags are set successfully.
 661  * @returns OPAL_ERR_BAD_PARAM If the variable is not registered.
 662  * @returns OPAL_ERROR Otherwise
 663  */
 664 OPAL_DECLSPEC int mca_base_var_set_flag(int vari, mca_base_var_flag_t flag,
 665                                         bool set);
 666 
 667 /**
 668  * Obtain basic info on a single variable (name, help message, etc)
 669  *
 670  * @param[in] vari Valid variable index.
 671  * @param[out] var Storage for the variable pointer.
 672  *
 673  * @retval OPAL_SUCCESS Upon success.
 674  * @retval opal error code Upon failure.
 675  *
 676  * The returned pointer belongs to the MCA variable system. Do not
 677  * modify/free/retain the pointer.
 678  */
 679 OPAL_DECLSPEC int mca_base_var_get (int vari, const mca_base_var_t **var);
 680 
 681 /**
 682  * Obtain the number of variables that have been registered.
 683  *
 684  * @retval count on success
 685  * @return opal error code on error
 686  *
 687  * Note: This function does not return the number of valid MCA variables as
 688  * mca_base_var_deregister() has no impact on the variable count. The count
 689  * returned is equal to the number of calls to mca_base_var_register with
 690  * unique names. ie. two calls with the same name will not affect the count.
 691  */
 692 OPAL_DECLSPEC int mca_base_var_get_count (void);
 693 
 694 /**
 695  * Obtain a list of enironment variables describing the all
 696  * valid (non-default) MCA variables and their sources.
 697  *
 698  * @param[out] env A pointer to an argv-style array of key=value
 699  * strings, suitable for use in an environment
 700  * @param[out] num_env A pointer to an int, containing the length
 701  * of the env array (not including the final NULL entry).
 702  * @param[in] internal Whether to include internal variables.
 703  *
 704  * @retval OPAL_SUCCESS Upon success.
 705  * @retval OPAL_ERROR Upon failure.
 706  *
 707  * This function is similar to mca_base_var_dump() except that
 708  * its output is in terms of an argv-style array of key=value
 709  * strings, suitable for using in an environment.
 710  */
 711 OPAL_DECLSPEC int mca_base_var_build_env(char ***env, int *num_env,
 712                                          bool internal);
 713 
 714 typedef enum {
 715     /* Dump human-readable strings */
 716     MCA_BASE_VAR_DUMP_READABLE = 0,
 717     /* Dump easily parsable strings */
 718     MCA_BASE_VAR_DUMP_PARSABLE = 1,
 719     /* Dump simple name=value string */
 720     MCA_BASE_VAR_DUMP_SIMPLE   = 2
 721 } mca_base_var_dump_type_t;
 722 
 723 /**
 724  * Dump strings describing the MCA variable at an index.
 725  *
 726  * @param[in]  vari        Variable index
 727  * @param[out] out         Array of strings describing this variable
 728  * @param[in]  output_type Type of output desired
 729  *
 730  * This function returns an array of strings describing the variable. All strings
 731  * and the array must be freed by the caller.
 732  */
 733 OPAL_DECLSPEC int mca_base_var_dump(int vari, char ***out, mca_base_var_dump_type_t output_type);
 734 
 735 #define MCA_COMPILETIME_VER "print_compiletime_version"
 736 #define MCA_RUNTIME_VER "print_runtime_version"
 737 
 738 /*
 739  * Parse a provided list of envars and add their local value, or
 740  * their assigned value, to the provided argv
 741  */
 742 OPAL_DECLSPEC int mca_base_var_process_env_list(char *list, char ***argv);
 743 OPAL_DECLSPEC int mca_base_var_process_env_list_from_file(char ***argv);
 744 
 745 /*
 746  * Initialize any file-based params
 747  */
 748 OPAL_DECLSPEC int mca_base_var_cache_files(bool rel_path_search);
 749 
 750 
 751 extern char *mca_base_env_list;
 752 #define MCA_BASE_ENV_LIST_SEP_DEFAULT ";"
 753 extern char *mca_base_env_list_sep;
 754 extern char *mca_base_env_list_internal;
 755 
 756 END_C_DECLS
 757 
 758 #endif /* OPAL_MCA_BASE_VAR_H */

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