20
20
* Copyright (c) 2018 Amazon.com, Inc. or its affiliates. All Rights reserved.
21
21
* Copyright (c) 2018 Triad National Security, LLC. All rights
22
22
* reserved.
23
- * Copyright (c) 2020 Google, LLC. All rights reserved.
23
+ * Copyright (c) 2020-2024 Google, LLC. All rights reserved.
24
24
* Copyright (c) 2021 Nanook Consulting. All rights reserved.
25
25
* Copyright (c) 2022 Computer Architecture and VLSI Systems (CARV)
26
26
* Laboratory, ICS Forth. All rights reserved.
@@ -138,6 +138,11 @@ static void fv_constructor(mca_base_var_file_value_t *p);
138
138
static void fv_destructor (mca_base_var_file_value_t * p );
139
139
OBJ_CLASS_INSTANCE (mca_base_var_file_value_t , opal_list_item_t , fv_constructor , fv_destructor );
140
140
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
+
141
146
static const char * mca_base_var_source_file (const mca_base_var_t * var )
142
147
{
143
148
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)
766
771
case MCA_BASE_VAR_TYPE_VERSION_STRING :
767
772
var_set_string (var , src );
768
773
break ;
774
+ case MCA_BASE_VAR_TYPE_INCLUDE_LIST :
775
+ mca_base_var_parse_include_list (src , & var -> mbv_storage -> ilistval );
776
+ break ;
769
777
case MCA_BASE_VAR_TYPE_MAX :
770
778
return OPAL_ERROR ;
771
779
}
@@ -803,11 +811,13 @@ int mca_base_var_set_value(int vari, const void *value, size_t size, mca_base_va
803
811
}
804
812
}
805
813
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 );
809
819
} else {
810
- var_set_string (var , ( char * ) value );
820
+ memmove (var -> mbv_storage , value , ompi_var_type_sizes [ var -> mbv_type ] );
811
821
}
812
822
813
823
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
817
827
var -> mbv_source_file = append_filename_to_list (source_file );
818
828
}
819
829
820
- return OPAL_SUCCESS ;
830
+ return ret ;
821
831
}
822
832
823
833
/*
@@ -847,11 +857,12 @@ int mca_base_var_deregister(int vari)
847
857
}
848
858
849
859
/* 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 ) {
853
862
free (var -> mbv_storage -> stringval );
854
863
var -> mbv_storage -> stringval = NULL ;
864
+ } else if (MCA_BASE_VAR_TYPE_INCLUDE_LIST == var -> mbv_type ) {
865
+ OBJ_DESTRUCT (& var -> mbv_storage -> ilistval );
855
866
} else {
856
867
OPAL_MCA_VAR_MBV_ENUMERATOR_FREE (var -> mbv_enumerator );
857
868
}
@@ -1046,9 +1057,11 @@ int mca_base_var_build_env(char ***env, int *num_env, bool internal)
1046
1057
continue ;
1047
1058
}
1048
1059
1049
- if ((MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
1060
+ if ((( MCA_BASE_VAR_TYPE_STRING == var -> mbv_type
1050
1061
|| 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 )) {
1052
1065
continue ;
1053
1066
}
1054
1067
@@ -1331,7 +1344,11 @@ static int register_variable(const char *project_name, const char *framework_nam
1331
1344
align = OPAL_ALIGNMENT_DOUBLE ;
1332
1345
break ;
1333
1346
case MCA_BASE_VAR_TYPE_VERSION_STRING :
1347
+ /* fall through */
1334
1348
case MCA_BASE_VAR_TYPE_STRING :
1349
+ /* fall through */
1350
+ case MCA_BASE_VAR_TYPE_INCLUDE_LIST :
1351
+ /* fall through */
1335
1352
default :
1336
1353
align = 0 ;
1337
1354
break ;
@@ -1533,6 +1550,9 @@ int mca_base_var_register(const char *project_name, const char *framework_name,
1533
1550
assert (NULL == enumerator
1534
1551
|| (MCA_BASE_VAR_TYPE_INT == type || MCA_BASE_VAR_TYPE_UNSIGNED_INT == type ));
1535
1552
1553
+
1554
+ assert (MCA_BASE_VAR_TYPE_INCLUDE_LIST != type || ((mca_base_var_include_list_t * ) storage )-> super .obj_reference_count > 0 );
1555
+
1536
1556
ret = register_variable (project_name , framework_name , component_name , variable_name ,
1537
1557
description , type , enumerator , bind , flags , info_lvl , scope , -1 ,
1538
1558
storage );
@@ -1855,25 +1875,26 @@ static void var_constructor(mca_base_var_t *var)
1855
1875
*/
1856
1876
static void var_destructor (mca_base_var_t * var )
1857
1877
{
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 ;
1863
1888
}
1864
1889
1865
1890
/* don't release the boolean enumerator */
1866
1891
OPAL_MCA_VAR_MBV_ENUMERATOR_FREE (var -> mbv_enumerator );
1867
1892
1868
- if (NULL != var -> mbv_long_name ) {
1869
- free (var -> mbv_long_name );
1870
- }
1893
+ free (var -> mbv_long_name );
1871
1894
var -> mbv_full_name = NULL ;
1872
1895
var -> mbv_variable_name = NULL ;
1873
1896
1874
- if (NULL != var -> mbv_description ) {
1875
- free (var -> mbv_description );
1876
- }
1897
+ free (var -> mbv_description );
1877
1898
1878
1899
/* Destroy the synonym array */
1879
1900
OBJ_DESTRUCT (& var -> mbv_synonyms );
@@ -1994,6 +2015,19 @@ static int var_value_string(mca_base_var_t *var, char **value_string)
1994
2015
case MCA_BASE_VAR_TYPE_DOUBLE :
1995
2016
ret = opal_asprintf (value_string , "%lf" , value -> lfval );
1996
2017
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 ;
1997
2031
default :
1998
2032
ret = -1 ;
1999
2033
break ;
@@ -2014,6 +2048,20 @@ static int var_value_string(mca_base_var_t *var, char **value_string)
2014
2048
return ret ;
2015
2049
}
2016
2050
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
+
2017
2065
int mca_base_var_check_exclusive (const char * project , const char * type_a , const char * component_a ,
2018
2066
const char * param_a , const char * type_b , const char * component_b ,
2019
2067
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
2290
2338
2291
2339
return OPAL_SUCCESS ;
2292
2340
}
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