Index: openmp/trunk/runtime/src/kmp_settings.c =================================================================== --- openmp/trunk/runtime/src/kmp_settings.c +++ openmp/trunk/runtime/src/kmp_settings.c @@ -712,6 +712,8 @@ // KMP_LIBRARY, OMP_WAIT_POLICY // ------------------------------------------------------------------------------------------------- +static char const *blocktime_str = NULL; + static void __kmp_stg_parse_wait_policy( char const * name, char const * value, void * data ) { @@ -725,9 +727,17 @@ if ( wait->omp ) { if ( __kmp_str_match( "ACTIVE", 1, value ) ) { - __kmp_library = library_turnaround; + __kmp_library = library_turnaround; + if ( blocktime_str == NULL ) { + // KMP_BLOCKTIME not specified, so set default to "infinite". + __kmp_dflt_blocktime = KMP_MAX_BLOCKTIME; + } } else if ( __kmp_str_match( "PASSIVE", 1, value ) ) { - __kmp_library = library_throughput; + __kmp_library = library_throughput; + if ( blocktime_str == NULL ) { + // KMP_BLOCKTIME not specified, so set default to 0. + __kmp_dflt_blocktime = 0; + } } else { KMP_WARNING( StgInvalidValue, name, value ); }; // if @@ -5025,6 +5035,9 @@ } }; // for i + // We need to know if blocktime was set when processing OMP_WAIT_POLICY + blocktime_str = __kmp_env_blk_var( & block, "KMP_BLOCKTIME" ); + // Special case. If we parse environment, not a string, process KMP_WARNINGS first. if ( string == NULL ) { char const * name = "KMP_WARNINGS"; Index: openmp/trunk/runtime/test/env/omp_wait_policy.c =================================================================== --- openmp/trunk/runtime/test/env/omp_wait_policy.c +++ openmp/trunk/runtime/test/env/omp_wait_policy.c @@ -0,0 +1,40 @@ +// RUN: %libomp-compile && env OMP_WAIT_POLICY=active %libomp-run active +// RUN: %libomp-compile && env OMP_WAIT_POLICY=passive %libomp-run passive +// +// OMP_WAIT_POLICY=active should imply blocktime == INT_MAX +// i.e., threads spin-wait forever +// OMP_WAIT_POLICY=passive should imply blocktime == 0 +// i.e., threads immediately sleep +#include +#include +#include +#include "omp_testsuite.h" + +void usage() { + fprintf(stderr, "usage: omp_wait_policy active|passive\n"); +} + +int main(int argc, char** argv) +{ + int blocktime, retval=1; + const char* env_var_value; + + if (argc != 2) { + usage(); + return 1; + } + + blocktime = kmp_get_blocktime(); + + env_var_value = argv[1]; + if (!strcmp(env_var_value, "active")) { + retval = (blocktime != INT_MAX); + } else if (!strcmp(env_var_value, "passive")) { + retval = (blocktime != 0); + } else { + usage(); + retval = 1; + } + + return retval; +}