2020 * Copyright (c) 2018 Amazon.com, Inc. or its affiliates. All Rights reserved.
2121 * Copyright (c) 2018 Triad National Security, LLC. All rights
2222 * reserved.
23- * Copyright (c) 2020 Google, LLC. All rights reserved.
23+ * Copyright (c) 2020-2024 Google, LLC. All rights reserved.
2424 * Copyright (c) 2021 Nanook Consulting. All rights reserved.
2525 * Copyright (c) 2022 Computer Architecture and VLSI Systems (CARV)
2626 * Laboratory, ICS Forth. All rights reserved.
@@ -138,6 +138,11 @@ static void fv_constructor(mca_base_var_file_value_t *p);
138138static void fv_destructor (mca_base_var_file_value_t * p );
139139OBJ_CLASS_INSTANCE (mca_base_var_file_value_t , opal_list_item_t , fv_constructor , fv_destructor );
140140
141+ static void include_list_contructor (mca_base_var_include_list_t * p );
142+ static void include_list_destructor (mca_base_var_include_list_t * p );
143+ OBJ_CLASS_INSTANCE (mca_base_var_include_list_t , opal_object_t , include_list_contructor ,
144+ include_list_destructor );
145+
141146static const char * mca_base_var_source_file (const mca_base_var_t * var )
142147{
143148 mca_base_var_file_value_t * fv = (mca_base_var_file_value_t * ) var -> mbv_file_value ;
@@ -766,6 +771,9 @@ static int var_set_from_string(mca_base_var_t *var, char *src)
766771 case MCA_BASE_VAR_TYPE_VERSION_STRING :
767772 var_set_string (var , src );
768773 break ;
774+ case MCA_BASE_VAR_TYPE_INCLUDE_LIST :
775+ mca_base_var_parse_include_list (src , & var -> mbv_storage -> ilistval );
776+ break ;
769777 case MCA_BASE_VAR_TYPE_MAX :
770778 return OPAL_ERROR ;
771779 }
@@ -803,11 +811,13 @@ int mca_base_var_set_value(int vari, const void *value, size_t size, mca_base_va
803811 }
804812 }
805813
806- if (MCA_BASE_VAR_TYPE_STRING != var -> mbv_type
807- && MCA_BASE_VAR_TYPE_VERSION_STRING != var -> mbv_type ) {
808- memmove (var -> mbv_storage , value , ompi_var_type_sizes [var -> mbv_type ]);
814+ if (MCA_BASE_VAR_TYPE_STRING == var -> mbv_type ||
815+ MCA_BASE_VAR_TYPE_VERSION_STRING == var -> mbv_type ) {
816+ ret = var_set_string (var , (char * ) value );
817+ } else if (MCA_BASE_VAR_TYPE_INCLUDE_LIST == var -> mbv_type ) {
818+ ret = mca_base_var_parse_include_list ((char * ) value , & var -> mbv_storage -> ilistval );
809819 } else {
810- var_set_string (var , ( char * ) value );
820+ memmove (var -> mbv_storage , value , ompi_var_type_sizes [ var -> mbv_type ] );
811821 }
812822
813823 var -> mbv_source = source ;
@@ -817,7 +827,7 @@ int mca_base_var_set_value(int vari, const void *value, size_t size, mca_base_va
817827 var -> mbv_source_file = append_filename_to_list (source_file );
818828 }
819829
820- return OPAL_SUCCESS ;
830+ return ret ;
821831}
822832
823833/*
@@ -847,11 +857,12 @@ int mca_base_var_deregister(int vari)
847857 }
848858
849859 /* Release the current value if it is a string. */
850- if ((MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
851- || MCA_BASE_VAR_TYPE_VERSION_STRING == var -> mbv_type )
852- && var -> mbv_storage -> stringval ) {
860+ if (MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
861+ || MCA_BASE_VAR_TYPE_VERSION_STRING == var -> mbv_type ) {
853862 free (var -> mbv_storage -> stringval );
854863 var -> mbv_storage -> stringval = NULL ;
864+ } else if (MCA_BASE_VAR_TYPE_INCLUDE_LIST == var -> mbv_type ) {
865+ OBJ_DESTRUCT (& var -> mbv_storage -> ilistval );
855866 } else {
856867 OPAL_MCA_VAR_MBV_ENUMERATOR_FREE (var -> mbv_enumerator );
857868 }
@@ -1046,9 +1057,11 @@ int mca_base_var_build_env(char ***env, int *num_env, bool internal)
10461057 continue ;
10471058 }
10481059
1049- if ((MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
1060+ if ((( MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
10501061 || MCA_BASE_VAR_TYPE_VERSION_STRING == var -> mbv_type )
1051- && NULL == var -> mbv_storage -> stringval ) {
1062+ && NULL == var -> mbv_storage -> stringval ) ||
1063+ (MCA_BASE_VAR_TYPE_INCLUDE_LIST == var -> mbv_type &&
1064+ NULL == var -> mbv_storage -> ilistval .items )) {
10521065 continue ;
10531066 }
10541067
@@ -1331,7 +1344,11 @@ static int register_variable(const char *project_name, const char *framework_nam
13311344 align = OPAL_ALIGNMENT_DOUBLE ;
13321345 break ;
13331346 case MCA_BASE_VAR_TYPE_VERSION_STRING :
1347+ /* fall through */
13341348 case MCA_BASE_VAR_TYPE_STRING :
1349+ /* fall through */
1350+ case MCA_BASE_VAR_TYPE_INCLUDE_LIST :
1351+ /* fall through */
13351352 default :
13361353 align = 0 ;
13371354 break ;
@@ -1533,6 +1550,9 @@ int mca_base_var_register(const char *project_name, const char *framework_name,
15331550 assert (NULL == enumerator
15341551 || (MCA_BASE_VAR_TYPE_INT == type || MCA_BASE_VAR_TYPE_UNSIGNED_INT == type ));
15351552
1553+
1554+ assert (MCA_BASE_VAR_TYPE_INCLUDE_LIST != type || ((mca_base_var_include_list_t * ) storage )-> super .obj_reference_count > 0 );
1555+
15361556 ret = register_variable (project_name , framework_name , component_name , variable_name ,
15371557 description , type , enumerator , bind , flags , info_lvl , scope , -1 ,
15381558 storage );
@@ -1855,25 +1875,26 @@ static void var_constructor(mca_base_var_t *var)
18551875 */
18561876static void var_destructor (mca_base_var_t * var )
18571877{
1858- if ((MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
1859- || MCA_BASE_VAR_TYPE_VERSION_STRING == var -> mbv_type )
1860- && NULL != var -> mbv_storage && NULL != var -> mbv_storage -> stringval ) {
1861- free (var -> mbv_storage -> stringval );
1862- var -> mbv_storage -> stringval = NULL ;
1878+ if (NULL != var -> mbv_storage ) {
1879+ if (MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
1880+ || MCA_BASE_VAR_TYPE_VERSION_STRING == var -> mbv_type ) {
1881+ free (var -> mbv_storage -> stringval );
1882+ var -> mbv_storage -> stringval = NULL ;
1883+ } else if (MCA_BASE_VAR_TYPE_INCLUDE_LIST == var -> mbv_type ) {
1884+ OBJ_DESTRUCT (& var -> mbv_storage -> ilistval );
1885+ }
1886+
1887+ var -> mbv_storage = NULL ;
18631888 }
18641889
18651890 /* don't release the boolean enumerator */
18661891 OPAL_MCA_VAR_MBV_ENUMERATOR_FREE (var -> mbv_enumerator );
18671892
1868- if (NULL != var -> mbv_long_name ) {
1869- free (var -> mbv_long_name );
1870- }
1893+ free (var -> mbv_long_name );
18711894 var -> mbv_full_name = NULL ;
18721895 var -> mbv_variable_name = NULL ;
18731896
1874- if (NULL != var -> mbv_description ) {
1875- free (var -> mbv_description );
1876- }
1897+ free (var -> mbv_description );
18771898
18781899 /* Destroy the synonym array */
18791900 OBJ_DESTRUCT (& var -> mbv_synonyms );
@@ -1994,6 +2015,19 @@ static int var_value_string(mca_base_var_t *var, char **value_string)
19942015 case MCA_BASE_VAR_TYPE_DOUBLE :
19952016 ret = opal_asprintf (value_string , "%lf" , value -> lfval );
19962017 break ;
2018+ case MCA_BASE_VAR_TYPE_INCLUDE_LIST :
2019+ if (NULL == value -> ilistval .items ) {
2020+ * value_string = strdup ("" );
2021+ } else {
2022+ char * tmp = opal_argv_join (value -> ilistval .items , ',' );
2023+ if (value -> ilistval .is_exclude ) {
2024+ ret = opal_asprintf (value_string , "^%s" , tmp );
2025+ free (tmp );
2026+ } else {
2027+ * value_string = tmp ;
2028+ }
2029+ }
2030+ break ;
19972031 default :
19982032 ret = -1 ;
19992033 break ;
@@ -2014,6 +2048,20 @@ static int var_value_string(mca_base_var_t *var, char **value_string)
20142048 return ret ;
20152049}
20162050
2051+ char * mca_base_var_string_value (int vari )
2052+ {
2053+ char * tmp = NULL ;
2054+ mca_base_var_t * var ;
2055+
2056+ int ret = var_get (vari , & var , false);
2057+ if (OPAL_SUCCESS != ret ) {
2058+ return NULL ;
2059+ }
2060+
2061+ (void ) var_value_string (var , & tmp );
2062+ return tmp ;
2063+ }
2064+
20172065int mca_base_var_check_exclusive (const char * project , const char * type_a , const char * component_a ,
20182066 const char * param_a , const char * type_b , const char * component_b ,
20192067 const char * param_b )
@@ -2290,3 +2338,34 @@ int mca_base_var_dump(int vari, char ***out, mca_base_var_dump_type_t output_typ
22902338
22912339 return OPAL_SUCCESS ;
22922340}
2341+
2342+ static void include_list_contructor (mca_base_var_include_list_t * p )
2343+ {
2344+ p -> items = NULL ;
2345+ p -> is_exclude = false;
2346+ }
2347+
2348+ static void include_list_destructor (mca_base_var_include_list_t * p )
2349+ {
2350+ opal_argv_free (p -> items );
2351+ include_list_contructor (p );
2352+ }
2353+
2354+ int mca_base_var_parse_include_list (const char * value , mca_base_var_include_list_t * result )
2355+ {
2356+ /* release any current value and set to defaults */
2357+ include_list_destructor (result );
2358+
2359+ if (NULL == value || 0 == strlen (value )) {
2360+ return OPAL_SUCCESS ;
2361+ }
2362+
2363+ if ('^' == value [0 ]) {
2364+ result -> is_exclude = true;
2365+ ++ value ;
2366+ }
2367+
2368+ result -> items = opal_argv_split (value , ',' );
2369+ return OPAL_SUCCESS ;
2370+ }
2371+
0 commit comments