diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..4c2686bc2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,705 @@ +# Automatically generated by build-gitignore.pl; edits may be lost! +.libs +.deps +.libs +.svn +*.la +*.lo +*.o +*.so +*.a +.dirstamp +*.dSYM +*.S +*.loT +*.orig +*.rej +*.class +*.xcscheme +*.plist +*~ +Makefile +Makefile.in +static-components.h +*\\# +config.cache +aclocal.m4 +autom4te.cache +config.log +config.status +configure +libtool +doxygen +bin +lib +cscope.* +etags +.cdt* +.project +.gdb* +GRTAGS +GSYMS +GTAGS +GPATH +vc70.pdb +.hgrc +.hgignore +.hg +.hgignore_local +aclocal.m4 +autom4te.cache +config.log +config.status +configure +libtool +config/ylwrap +config/config.guess +config/config.sub +config/depcomp +config/compile +config/install-sh +config/ltmain.sh +config/ltmain.sh.orig +config/missing +config/mkinstalldirs +config/mca_no_configure_components.m4 +config/mca_m4_config_include.m4 +config/ext_no_configure_components.m4 +config/ext_m4_config_include.m4 +config/libtool.m4 +config/libtool.m4.orig +config/libtool.m4.rej +config/lt~obsolete.m4 +config/ltdl.m4 +config/argz.m4 +config/ltsugar.m4 +config/ltversion.m4 +config/ltoptions.m4 +config/project_list.m4 +config/autogen_found_items.m4 +config/opal_get_version.sh +config/test-driver +contrib/build-mca-comps-outside-of-tree/btl_tcp2_config.h +contrib/build-mca-comps-outside-of-tree/btl_tcp2_config.h.in +contrib/build-mca-comps-outside-of-tree/autom4te.cache +contrib/build-mca-comps-outside-of-tree/config +contrib/build-mca-comps-outside-of-tree/aclocal.m4 +contrib/build-mca-comps-outside-of-tree/configure +contrib/build-mca-comps-outside-of-tree/config.log +contrib/build-mca-comps-outside-of-tree/config.status +contrib/build-mca-comps-outside-of-tree/stamp-h? +contrib/build-mca-comps-outside-of-tree/libtool +contrib/scaling/orte_no_op +contrib/scaling/mpi_no_op +contrib/scaling/mpi_barrier +examples/hello_c +examples/hello_cxx +examples/hello_mpifh +examples/hello_usempi +examples/hello_usempif08 +examples/ring_c +examples/ring_cxx +examples/ring_mpifh +examples/ring_usempi +examples/ring_usempif08 +examples/connectivity_c +ompi/libltdl +ompi/GPATH +ompi/GRTAGS +ompi/GYSMS +ompi/GTAGS +ompi/GSYMS +ompi/contrib/vt/vt/aclocal.m4 +ompi/contrib/vt/vt/autom4te.cache +ompi/contrib/vt/vt/config.h +ompi/contrib/vt/vt/config.h.in +ompi/contrib/vt/vt/config.log +ompi/contrib/vt/vt/config.status +ompi/contrib/vt/vt/configure +ompi/contrib/vt/vt/libtool +ompi/contrib/vt/vt/stamp-h1 +ompi/contrib/vt/vt/config/compile +ompi/contrib/vt/vt/config/config.guess +ompi/contrib/vt/vt/config/config.sub +ompi/contrib/vt/vt/config/depcomp +ompi/contrib/vt/vt/config/install-sh +ompi/contrib/vt/vt/config/ltmain.sh +ompi/contrib/vt/vt/config/ltmain.sh.orig +ompi/contrib/vt/vt/config/missing +ompi/contrib/vt/vt/config/m4/libtool.m4 +ompi/contrib/vt/vt/config/m4/lt~obsolete.m4 +ompi/contrib/vt/vt/config/m4/ltoptions.m4 +ompi/contrib/vt/vt/config/m4/ltsugar.m4 +ompi/contrib/vt/vt/config/m4/ltversion.m4 +ompi/contrib/vt/vt/config/mpigen/mk_c_wrapper.sh +ompi/contrib/vt/vt/config/mpigen/mk_fortran_wrapper.sh +ompi/contrib/vt/vt/config/mpigen/mk_registry.sh +ompi/contrib/vt/vt/extlib/otf/aclocal.m4 +ompi/contrib/vt/vt/extlib/otf/autom4te.cache +ompi/contrib/vt/vt/extlib/otf/config.h +ompi/contrib/vt/vt/extlib/otf/config.h.in +ompi/contrib/vt/vt/extlib/otf/config.log +ompi/contrib/vt/vt/extlib/otf/config.status +ompi/contrib/vt/vt/extlib/otf/configure +ompi/contrib/vt/vt/extlib/otf/libtool +ompi/contrib/vt/vt/extlib/otf/stamp-h1 +ompi/contrib/vt/vt/extlib/otf/config/config.guess +ompi/contrib/vt/vt/extlib/otf/config/config.sub +ompi/contrib/vt/vt/extlib/otf/config/depcomp +ompi/contrib/vt/vt/extlib/otf/config/install-sh +ompi/contrib/vt/vt/extlib/otf/config/ltmain.sh +ompi/contrib/vt/vt/extlib/otf/config/ltmain.sh.orig +ompi/contrib/vt/vt/extlib/otf/config/missing +ompi/contrib/vt/vt/extlib/otf/config/py-compile +ompi/contrib/vt/vt/extlib/otf/config/m4/libtool.m4 +ompi/contrib/vt/vt/extlib/otf/config/m4/lt~obsolete.m4 +ompi/contrib/vt/vt/extlib/otf/config/m4/ltoptions.m4 +ompi/contrib/vt/vt/extlib/otf/config/m4/ltsugar.m4 +ompi/contrib/vt/vt/extlib/otf/config/m4/ltversion.m4 +ompi/contrib/vt/vt/extlib/otf/otflib/OTF_inttypes_unix.h +ompi/contrib/vt/vt/extlib/otf/tests/generic_streams/otf_generic_streams +ompi/contrib/vt/vt/extlib/otf/tests/generic_streams-mpi/otf_generic_streams_mpi +ompi/contrib/vt/vt/extlib/otf/tests/hello/otf_hello +ompi/contrib/vt/vt/extlib/otf/tests/progress/otf_progress +ompi/contrib/vt/vt/extlib/otf/tests/read_from_buffer/otf_read_from_buffer +ompi/contrib/vt/vt/extlib/otf/tests/thumbnail/otf_thumbnail +ompi/contrib/vt/vt/extlib/otf/tools/otf2vtf/otf2vtf +ompi/contrib/vt/vt/extlib/otf/tools/otfaux/otfaux +ompi/contrib/vt/vt/extlib/otf/tools/otfcompress/otfcompress +ompi/contrib/vt/vt/extlib/otf/tools/otfconfig/otfconfig +ompi/contrib/vt/vt/extlib/otf/tools/otfdump/otfdump +ompi/contrib/vt/vt/extlib/otf/tools/otfdump/otfprint +ompi/contrib/vt/vt/extlib/otf/tools/otfinfo/otfinfo +ompi/contrib/vt/vt/extlib/otf/tools/otfmerge/otfmerge +ompi/contrib/vt/vt/extlib/otf/tools/otfmerge/mpi/otfmerge-mpi +ompi/contrib/vt/vt/extlib/otf/tools/otfmerge-mpi/otfmerge-mpi +ompi/contrib/vt/vt/extlib/otf/tools/otfprofile/otfprofile +ompi/contrib/vt/vt/extlib/otf/tools/otfprofile/mpi/otfprofile-mpi +ompi/contrib/vt/vt/extlib/otf/tools/otfprofile-mpi/otfprofile-mpi +ompi/contrib/vt/vt/extlib/otf/tools/otfshrink/otfshrink +ompi/contrib/vt/vt/extlib/otf/tools/vtf2otf/vtf2otf +ompi/contrib/vt/vt/include/vt_inttypes.h +ompi/contrib/vt/vt/tools/opari/tool/opari +ompi/contrib/vt/vt/tools/vtcpcavail/vtcpcavail +ompi/contrib/vt/vt/tools/vtdyn/vtdyn +ompi/contrib/vt/vt/tools/vtdyn/dynattlib/libvt-dynatt.* +ompi/contrib/vt/vt/tools/vtfilter/vtfilter +ompi/contrib/vt/vt/tools/vtfilter/mpi/vtfilter-mpi +ompi/contrib/vt/vt/tools/vtiofsl/vtiofsl-common +ompi/contrib/vt/vt/tools/vtiofsl/vtiofsl-start +ompi/contrib/vt/vt/tools/vtiofsl/vtiofsl-stop +ompi/contrib/vt/vt/tools/vtjava/vtjava +ompi/contrib/vt/vt/tools/vtlibwrapgen/vt_libwrapgen_defs.h +ompi/contrib/vt/vt/tools/vtlibwrapgen/vtlibwrapgen +ompi/contrib/vt/vt/tools/vtrun/vtrun +ompi/contrib/vt/vt/tools/vtsetup/vtsetup +ompi/contrib/vt/vt/tools/vtsetup/vtsetup-config.xml +ompi/contrib/vt/vt/tools/vtsetup/vtsetup-data.xml +ompi/contrib/vt/vt/tools/vtsetup/doc/ChangeLog +ompi/contrib/vt/vt/tools/vtsetup/doc/LICENSE +ompi/contrib/vt/vt/tools/vtunify/vtunify +ompi/contrib/vt/vt/tools/vtunify/mpi/vtunify-mpi +ompi/contrib/vt/vt/tools/vtwrapper/vtwrapper +ompi/contrib/vt/vt/tools/vtwrapper/vtcc-wrapper-data.txt +ompi/contrib/vt/vt/tools/vtwrapper/vtc++-wrapper-data.txt +ompi/contrib/vt/vt/tools/vtwrapper/vtfort-wrapper-data.txt +ompi/contrib/vt/vt/tools/vtwrapper/vtf77-wrapper-data.txt +ompi/contrib/vt/vt/tools/vtwrapper/vtf90-wrapper-data.txt +ompi/contrib/vt/vt/tools/vtwrapper/vtnvcc-wrapper-data.txt +ompi/contrib/vt/vt/util/installdirs_conf.h +ompi/contrib/vt/vt/vtlib/vt_fmpiwrap.gen.c +ompi/contrib/vt/vt/vtlib/vt_mpireg.gen.c +ompi/contrib/vt/vt/vtlib/vt_mpireg.gen.h +ompi/contrib/vt/vt/vtlib/vt_mpiwrap.gen.c +ompi/contrib/vt/wrappers/mpi*txt +ompi/debuggers/*.in +ompi/debuggers/dlopen_test +ompi/debuggers/predefined_gap_test +ompi/include/stamp-h* +ompi/include/ompi_config.h +ompi/include/mpi.h +ompi/include/mpif-config.h +ompi/include/mpif.h +ompi/include/mpif-common.h +ompi/include/mpi-ext.h +ompi/include/mpif-ext.h +ompi/include/mpif-handles.h +ompi/include/mpif-io-constants.h +ompi/include/mpif-constants.h +ompi/include/mpif-io-handles.h +ompi/include/ompi/version.h +ompi/mca/btl/openib/btl_openib_lex.c +ompi/mca/btl/udapl/*.in +ompi/mca/coll/basic/coll-basic-version.h* +ompi/mca/coll/demo/acinclude.m4 +ompi/mca/coll/demo/aclocal.m4 +ompi/mca/coll/demo/configure +ompi/mca/coll/demo/configure.ac +ompi/mca/coll/demo/config.log +ompi/mca/coll/demo/config.status +ompi/mca/coll/demo/config.guess +ompi/mca/coll/demo/config.sub +ompi/mca/coll/demo/config +ompi/mca/coll/demo/libtool +ompi/mca/coll/demo/autom4te.cache +ompi/mca/coll/demo/depcomp +ompi/mca/coll/demo/ltmain.sh +ompi/mca/coll/demo/missing +ompi/mca/coll/demo/install-sh +ompi/mca/coll/demo/*bak +ompi/mca/coll/demo/coll_demo_config.h* +ompi/mca/coll/demo/stamp-h1* +ompi/mca/coll/demo/.lam* +ompi/mca/coll/demo/coll-demo-version.h* +ompi/mca/coll/ml/coll_ml_lex.c +ompi/mca/coll/self/coll-self-version.h* +ompi/mca/coll/sm/coll-sm-version.h* +ompi/mca/crcp/ompi_crcp.7 +ompi/mca/io/romio/acinclude.m4* +ompi/mca/io/romio/aclocal.m4 +ompi/mca/io/romio/configure +ompi/mca/io/romio/configure.ac* +ompi/mca/io/romio/config.log +ompi/mca/io/romio/config.status +ompi/mca/io/romio/libtool +ompi/mca/io/romio/autom4te.cache +ompi/mca/io/romio/config.guess +ompi/mca/io/romio/config.sub +ompi/mca/io/romio/depcomp +ompi/mca/io/romio/install-sh +ompi/mca/io/romio/ltmain.sh +ompi/mca/io/romio/missing +ompi/mca/io/romio/mkinstalldirs +ompi/mca/io/romio/stamp-h1 +ompi/mca/io/romio/io-romio-version.h* +ompi/mca/io/romio/romio/config.log +ompi/mca/io/romio/romio/config.status +ompi/mca/io/romio/romio/autom4te.cache +ompi/mca/io/romio/romio/libtool +ompi/mca/io/romio/romio/lib +ompi/mca/io/romio/romio/configure +ompi/mca/io/romio/romio/aclocal.m4 +ompi/mca/io/romio/romio/depcomp +ompi/mca/io/romio/romio/config.guess +ompi/mca/io/romio/romio/ltmain.sh +ompi/mca/io/romio/romio/config.sub +ompi/mca/io/romio/romio/missing +ompi/mca/io/romio/romio/install-sh +ompi/mca/io/romio/romio/localdefs +ompi/mca/io/romio/romio/adio/include/romioconf.h +ompi/mca/io/romio/romio/adio/include/romioconf.h.in +ompi/mca/io/romio/romio/adio/include/stamp-h1 +ompi/mca/io/romio/romio/confdb/depcomp +ompi/mca/io/romio/romio/confdb/missing +ompi/mca/io/romio/romio/confdb/ltmain.sh +ompi/mca/io/romio/romio/confdb/config.guess +ompi/mca/io/romio/romio/confdb/config.sub +ompi/mca/io/romio/romio/confdb/install-sh +ompi/mca/io/romio/romio/confdb/.placeholder +ompi/mca/io/romio/romio/include/mpio.h +ompi/mca/io/romio/romio/include/mpiof.h +ompi/mca/io/romio/romio/mpi-io/glue/openmpi/io_romio_mpio_file.c +ompi/mca/io/romio/romio/mpi-io/glue/openmpi/io_romio_mpio_err.c +ompi/mca/io/romio/romio/test/runtests +ompi/mca/io/romio/romio/test/large_file.c +ompi/mca/io/romio/romio/test/misc.c +ompi/mca/io/romio/romio/test/fcoll_test.f +ompi/mca/io/romio/romio/test/fmisc.f +ompi/mca/io/romio/romio/test/fperf.f +ompi/mca/io/romio/romio/test/pfcoll_test.f +ompi/mca/io/romio/romio/test/status +ompi/mca/io/romio/romio/test/coll_test +ompi/mca/io/romio/romio/test/atomicity +ompi/mca/io/romio/romio/test/async-multiple +ompi/mca/io/romio/romio/test/i_noncontig +ompi/mca/io/romio/romio/test/noncontig_coll2 +ompi/mca/io/romio/romio/test/large_file +ompi/mca/io/romio/romio/test/shared_fp +ompi/mca/io/romio/romio/test/misc +ompi/mca/io/romio/romio/test/perf +ompi/mca/io/romio/romio/test/noncontig +ompi/mca/io/romio/romio/test/split_coll +ompi/mca/io/romio/romio/test/psimple +ompi/mca/io/romio/romio/test/async +ompi/mca/io/romio/romio/test/large_array +ompi/mca/io/romio/romio/test/simple +ompi/mca/io/romio/romio/test/error +ompi/mca/io/romio/romio/test/file_info +ompi/mca/io/romio/romio/test/coll_perf +ompi/mca/io/romio/romio/test/aggregation1 +ompi/mca/io/romio/romio/test/aggregation2 +ompi/mca/io/romio/romio/test/excl +ompi/mca/io/romio/romio/test/noncontig_coll +ompi/mca/io/romio/romio/test/ordered_fp +ompi/mca/io/romio/romio/test/hindexed +ompi/mca/io/romio/romio/util/romioinstall +ompi/mca/io/romio/src/stamp-h1 +ompi/mca/io/romio/src/romio_config.h +ompi/mca/io/romio/src/romio_config.h.in +ompi/mca/pml/v/autogen.vprotocols +ompi/mca/pml/v/mca_vprotocol_config_output +ompi/mca/rte/orte/ompi-ps.1 +ompi/mca/rte/orte/ompi-clean.1 +ompi/mca/rte/orte/mpiexec.1 +ompi/mca/rte/orte/ompi-top.1 +ompi/mca/rte/orte/ompi-server.1 +ompi/mca/rte/orte/mpirun.1 +ompi/mca/topo/unity/topo-unity-version.h* +ompi/mpi/c/profile/p*.c +ompi/mpi/fortran/configure-fortran-output.h +ompi/mpi/fortran/base/*.mod +ompi/mpi/fortran/mpiext/mpi-ext-module.F90 +ompi/mpi/fortran/mpiext/mpi-f08-ext-module.F90 +ompi/mpi/fortran/mpiext/*.mod +ompi/mpi/fortran/mpif-h/profile/p*.c +ompi/mpi/fortran/use-mpi-f08/constants.h +ompi/mpi/fortran/use-mpi-f08/*.mod +ompi/mpi/fortran/use-mpi-ignore-tkr/mpi-ignore-tkr-interfaces.h +ompi/mpi/fortran/use-mpi-ignore-tkr/mpi-ignore-tkr-file-interfaces.h +ompi/mpi/fortran/use-mpi-ignore-tkr/*.mod +ompi/mpi/fortran/use-mpi-tkr/fortran_kinds.sh +ompi/mpi/fortran/use-mpi-tkr/fortran_sizes.h +ompi/mpi/fortran/use-mpi-tkr/mpi_*.f90 +ompi/mpi/fortran/use-mpi-tkr/mpi.mod +ompi/mpi/fortran/use-mpi-tkr/MPI.mod +ompi/mpi/fortran/use-mpi-tkr/mpi_kinds.mod +ompi/mpi/fortran/use-mpi-tkr/mpi_kinds.ompi_module +ompi/mpi/fortran/use-mpi-tkr/mpi-f90-interfaces.h +ompi/mpi/fortran/use-mpi-tkr/libmpi_f90.a +ompi/mpi/java/java/mpi +ompi/mpi/java/java/*.jar +ompi/mpi/java/java/*.h +ompi/mpi/man/man3/MPI*.3 +ompi/mpi/man/man3/OpenMPI.3 +ompi/mpi/man/man3/.dir-stamp +ompi/mpiext/affinity/c/OMPI_Affinity_str.3 +ompi/mpiext/affinity/c/example +ompi/mpiext/example/tests/progress_c +ompi/mpiext/example/tests/progress_mpifh +ompi/mpiext/example/tests/progress_usempi +ompi/mpiext/example/tests/progress_usempif08 +ompi/mpiext/example/use-mpi-f08/*.mod +ompi/tools/ompi_info/ompi_info +ompi/tools/ompi_info/*.ii +ompi/tools/ompi_info/*.ti +ompi/tools/ompi_info/ompi_info.1 +ompi/tools/wrappers/mpic++-wrapper-data.txt +ompi/tools/wrappers/mpicc-wrapper-data.txt +ompi/tools/wrappers/mpifort-wrapper-data.txt +ompi/tools/wrappers/mpicc.1 +ompi/tools/wrappers/mpic++.1 +ompi/tools/wrappers/mpicxx.1 +ompi/tools/wrappers/mpifort.1 +ompi/tools/wrappers/ompi_wrapper_script +ompi/tools/wrappers/ompi.pc +ompi/tools/wrappers/ompi-c.pc +ompi/tools/wrappers/ompi-cxx.pc +ompi/tools/wrappers/ompi-fort.pc +ompi/tools/wrappers/mpijavac.pl +ompi/tools/wrappers/mpif90.1 +ompi/tools/wrappers/mpif77.1 +opal/libltdl +opal/vc70.pdb +opal/asm/atomic-asm.S +opal/asm/atomic-test +opal/asm/vc70.pdb +opal/asm/*.obj +opal/asm/generated/atomic-*.s +opal/class/*.obj +opal/include/opal_config.h +opal/include/opal_config.h.in +opal/include/stamp-h1 +opal/include/opal/install_dirs.h +opal/include/opal/version.h +opal/include/opal/sys/powerpc/atomic-32.s +opal/include/opal/sys/powerpc/atomic-64.s +opal/include/opal/sys/powerpc/atomic-32-64.s +opal/mca/base/*.obj +opal/mca/base/mca_base_parse_paramfile_lex.c +opal/mca/base/vc70.pdb +opal/mca/crs/opal_crs.7 +opal/mca/event/libevent2019/libevent/stamp-h1 +opal/mca/event/libevent2019/libevent/autom4te.cache +opal/mca/event/libevent2019/libevent/libtool +opal/mca/event/libevent2019/libevent/config.log +opal/mca/event/libevent2019/libevent/config.status +opal/mca/event/libevent2019/libevent/config.h +opal/mca/event/libevent2019/libevent/libevent.pc +opal/mca/event/libevent2019/libevent/libevent_openssl.pc +opal/mca/event/libevent2019/libevent/libevent_pthreads.pc +opal/mca/event/libevent2019/libevent/compile +opal/mca/event/libevent2019/libevent/ltmain.sh +opal/mca/event/libevent2019/libevent/install-sh +opal/mca/event/libevent2019/libevent/missing +opal/mca/event/libevent2019/libevent/config.sub +opal/mca/event/libevent2019/libevent/config.guess +opal/mca/event/libevent2019/libevent/configure +opal/mca/event/libevent2019/libevent/depcomp +opal/mca/event/libevent2019/libevent/aclocal.m4 +opal/mca/event/libevent2019/libevent/include/event2/event-config.h +opal/mca/event/libevent2019/libevent/m4/ltsugar.m4 +opal/mca/event/libevent2019/libevent/m4/libtool.m4 +opal/mca/event/libevent2019/libevent/m4/ltversion.m4 +opal/mca/event/libevent2019/libevent/m4/lt~obsolete.m4 +opal/mca/event/libevent2019/libevent/m4/ltoptions.m4 +opal/mca/hwloc/hwloc151/hwloc/include/hwloc/autogen/stamp-h? +opal/mca/hwloc/hwloc151/hwloc/include/hwloc/autogen/config.h +opal/mca/hwloc/hwloc151/hwloc/include/private/autogen/stamp-h? +opal/mca/hwloc/hwloc151/hwloc/include/private/autogen/config.h +opal/mca/installdirs/config/install_dirs.h +opal/mca/memory/vc70.pdb +opal/mca/memory/base/*.obj +opal/mca/pstat/*.obj +opal/mca/pstat/base/*.obj +opal/mca/timer/vc70.pdb +opal/mca/timer/base/*.obj +opal/memoryhooks/*.obj +opal/runtime/*.obj +opal/threads/*.obj +opal/tools/opal-checkpoint/opal-checkpoint +opal/tools/opal-checkpoint/opal-checkpoint.1 +opal/tools/opal-restart/opal-restart +opal/tools/opal-restart/opal-restart.1 +opal/tools/wrappers/opalcc-wrapper-data.txt +opal/tools/wrappers/opalc++-wrapper-data.txt +opal/tools/wrappers/opalCC-wrapper-data.txt +opal/tools/wrappers/opal_wrapper +opal/tools/wrappers/opalcc.1 +opal/tools/wrappers/opalc++.1 +opal/tools/wrappers/generic_wrapper.1 +opal/tools/wrappers/opal_wrapper.1 +opal/tools/wrappers/opal.pc +opal/util/*.obj +opal/util/show_help_lex.c +opal/util/vc70.pdb +opal/util/keyval/keyval_lex.c +opal/win32/*.obj +orte/doxygen +orte/include/stamp-h* +orte/include/orte_config.h +orte/include/orte/version.h +orte/mca/dfs/vc70.pdb +orte/mca/dfs/base/*.obj +orte/mca/errmgr/vc70.pdb +orte/mca/errmgr/base/*.obj +orte/mca/filem/orte_filem.7 +orte/mca/odls/default/.gdb_history +orte/mca/oob/tcp/acinclude.m4 +orte/mca/oob/tcp/aclocal.m4 +orte/mca/oob/tcp/configure +orte/mca/oob/tcp/configure.ac +orte/mca/oob/tcp/config.log +orte/mca/oob/tcp/config.status +orte/mca/oob/tcp/libtool +orte/mca/oob/tcp/autom4te.cache +orte/mca/oob/tcp/.lam* +orte/mca/rmaps/rank_file/rmaps_rank_file_lex.c +orte/mca/rmaps/rank_file/rankfile_lex.c +orte/mca/snapc/orte_snapc.7 +orte/mca/sstore/orte_sstore.7 +orte/test/mpi/abort +orte/test/mpi/accept +orte/test/mpi/bad_exit +orte/test/mpi/bcast_loop +orte/test/mpi/concurrent_spawn +orte/test/mpi/connect +orte/test/mpi/crisscross +orte/test/mpi/delayed_abort +orte/test/mpi/hello_barrier +orte/test/mpi/hello_nodename +orte/test/mpi/hello_output +orte/test/mpi/hello_show_help +orte/test/mpi/hello +orte/test/mpi/hello++ +orte/test/mpi/loop_child +orte/test/mpi/loop_spawn +orte/test/mpi/mpi_barrier +orte/test/mpi/mpi_no_op +orte/test/mpi/mpi_spin +orte/test/mpi/multi_abort +orte/test/mpi/parallel_r8 +orte/test/mpi/parallel_r64 +orte/test/mpi/parallel_w8 +orte/test/mpi/parallel_w64 +orte/test/mpi/pubsub +orte/test/mpi/read_write +orte/test/mpi/reduce-hang +orte/test/mpi/segv +orte/test/mpi/simple_spawn +orte/test/mpi/slave +orte/test/mpi/spawn_multiple +orte/test/mpi/ziaprobe +orte/test/mpi/ziatest +orte/test/mpi/.gdb_history +orte/test/mpi/junk* +orte/test/mpi/sio +orte/test/mpi/sendrecv_blaster +orte/test/mpi/early_abort +orte/test/mpi/spawn_problem/ch_rec +orte/test/mpi/spawn_problem/output +orte/test/mpi/spawn_problem/start +orte/test/mpi/debugger +orte/test/mpi/server_port_name.txt +orte/test/mpi/singleton_client_server +orte/test/mpi/intercomm_create +orte/test/mpi/spawn_tree +orte/test/mpi/init-exit77 +orte/test/mpi/mpi_info +orte/test/system/radix +orte/test/system/sigusr_trap +orte/test/system/orte_no_op +orte/test/system/no_op +orte/test/system/hello +orte/test/system/hello_nodename +orte/test/system/hello_null +orte/test/system/.gdb* +orte/test/system/spin +orte/test/system/orte_nodename +orte/test/system/orte_proc_subscribe +orte/test/system/orte_spawn +orte/test/system/orte_stage_gate +orte/test/system/orte_loop_spawn +orte/test/system/orte_loop_child +orte/test/system/orte_abort +orte/test/system/get_limits +orte/test/system/orte_ring +orte/test/system/spawn_child +orte/test/system/orte_tool +orte/test/system/binom +orte/test/system/iof_stress +orte/test/system/oob_stress +orte/test/system/iof_delay +orte/test/system/orte_barrier +orte/test/system/orte_mcast +orte/test/system/mcast +orte/test/system/mcast_recv +orte/test/system/opal_interface +orte/test/system/orte_spin +orte/test/system/segfault +orte/test/system/sysinfo +orte/test/system/orte_exit +orte/test/system/orte_db +orte/test/system/orte_state +orte/test/system/orte_sensor +orte/test/system/event-threads +orte/test/system/test-time +orte/test/system/psm_keygen +orte/test/system/regex +orte/test/system/orte_errors +orte/test/system/evthread-test +orte/test/system/evpri-test +orte/test/system/opal-evpri-test +orte/test/system/evpri-test2 +orte/test/system/mapper +orte/test/system/reducer +orte/test/system/opal_hotel +orte/test/system/orte_dfs +orte/test/system/orte_allocate +orte/tools/orte-checkpoint/orte-checkpoint +orte/tools/orte-checkpoint/orte-checkpoint.1 +orte/tools/orte-checkpoint/ompi-checkpoint.1 +orte/tools/orte-clean/orte-clean +orte/tools/orte-clean/orte-clean.1 +orte/tools/orte-info/orte-info +orte/tools/orte-info/*.exe +orte/tools/orte-info/orte-info.1 +orte/tools/orte-migrate/orte-migrate +orte/tools/orte-migrate/orte-migrate.1 +orte/tools/orte-migrate/ompi-migrate.1 +orte/tools/orte-ps/orte-ps +orte/tools/orte-ps/orte-ps.1 +orte/tools/orte-restart/orte-restart +orte/tools/orte-restart/orte-restart.1 +orte/tools/orte-restart/ompi-restart.1 +orte/tools/orte-server/orte-server +orte/tools/orte-server/orte-server.1 +orte/tools/orte-top/orte-top +orte/tools/orte-top/orte-top.1 +orte/tools/orted/orted +orte/tools/orted/orted.1 +orte/tools/orted/.gdb_history +orte/tools/orted/*.exe +orte/tools/orterun/orterun +orte/tools/orterun/*.exe +orte/tools/orterun/orterun.1 +orte/tools/wrappers/ortecc-wrapper-data.txt +orte/tools/wrappers/ortec++-wrapper-data.txt +orte/tools/wrappers/ortecc.1 +orte/tools/wrappers/ortec++.1 +orte/tools/wrappers/orte_wrapper_script +orte/tools/wrappers/orte.pc +orte/util/hostfile/hostfile_lex.c +orte/util/hostfile/orte_hosts.7 +test/asm/.gdb_history +test/asm/atomic_math_noinline +test/asm/atomic_barrier +test/asm/atomic_cmpset_noinline +test/asm/atomic_math +test/asm/atomic_cmpset +test/asm/atomic_spinlock_noinline.c +test/asm/atomic_barrier_noinline.c +test/asm/atomic_math_noinline.c +test/asm/atomic_cmpset_noinline.c +test/asm/atomic_spinlock_noinline +test/asm/atomic_barrier_noinline +test/asm/atomic_spinlock +test/class/*.txt +test/class/*.exe +test/class/ompi_circular_buffer_fifo +test/class/ompi_bitmap_test_out.txt +test/class/ompi_fifo +test/class/opal_list +test/class/opal_hash_table +test/class/opal_value_array +test/class/ompi_rb_tree +test/class/ompi_bitmap +test/class/opal_pointer_array +test/class/opal_bitmap +test/class/opal_tree +test/datatype/ddt_test +test/datatype/ddt_pack +test/datatype/to_self +test/datatype/checksum +test/datatype/position +test/datatype/ddt_raw +test/datatype/opal_datatype_test +test/dss/dss_buffer +test/dss/dss_copy +test/dss/dss_size +test/dss/dss_cmp +test/dss/dss_release +test/dss/dss_payload +test/dss/dss_set_get +test/dss/dss_print +test/event/signal-test +test/event/event-test +test/event/time-test +test/mpi/environment/.gdb_history +test/mpi/environment/chello +test/runtime/.gdb_history +test/runtime/parse_context +test/runtime/sigchld +test/runtime/start_shut +test/runtime/opal_init_finalize +test/runtime/orte_init_finalize +test/threads/opal_condition +test/threads/opal_thread +test/util/aaa +test/util/test_session_dir_out +test/util/opal_os_path +test/util/opal_argv +test/util/opal_os_create_dirpath +test/util/opal_if +test/util/opal_error +test/util/opal_timer +test/util/orte_sys_info +test/util/orte_session_dir +test/util/orte_sys_info +test/util/orte_universe_setup_file_io +test/util/opal_basename +test/util/ompi_numtostr +test/util/ompi_pack +test/util/test-file +test/util/opal_sos +test/util/opal_path_nfs +test/util/opal_bit_ops diff --git a/opal/mca/base/Makefile.am b/opal/mca/base/Makefile.am index 126c457ff2..4c8db25db7 100644 --- a/opal/mca/base/Makefile.am +++ b/opal/mca/base/Makefile.am @@ -36,7 +36,8 @@ headers = \ mca_base_var_enum.h \ mca_base_vari.h \ mca_base_param.h \ - mca_base_param_internal.h + mca_base_param_internal.h \ + mca_base_framework.h # Library @@ -56,7 +57,8 @@ libmca_base_la_SOURCES = \ mca_base_var.c \ mca_base_var_enum.c \ mca_base_parse_paramfile.c \ - mca_base_components_register.c + mca_base_components_register.c \ + mca_base_framework.c # Conditionally install the header files diff --git a/opal/mca/base/base.h b/opal/mca/base/base.h index 2cd9539fae..c53d26f7aa 100644 --- a/opal/mca/base/base.h +++ b/opal/mca/base/base.h @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana * University Research and Technology @@ -10,6 +11,8 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2009 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2013 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -31,6 +34,7 @@ #include "opal/mca/mca.h" #include "opal/mca/base/mca_base_param.h" #include "opal/mca/base/mca_base_var.h" +#include "opal/mca/base/mca_base_framework.h" #include "opal/util/cmd_line.h" BEGIN_C_DECLS @@ -61,11 +65,10 @@ OPAL_DECLSPEC OBJ_CLASS_DECLARATION(mca_base_component_priority_list_item_t); * Public variables */ OPAL_DECLSPEC extern char *mca_base_component_path; -OPAL_DECLSPEC extern bool mca_base_opened; -OPAL_DECLSPEC extern char *mca_base_system_default_path; -OPAL_DECLSPEC extern char *mca_base_user_default_path; OPAL_DECLSPEC extern bool mca_base_component_show_load_errors; OPAL_DECLSPEC extern bool mca_base_component_disable_dlopen; +OPAL_DECLSPEC extern char *mca_base_system_default_path; +OPAL_DECLSPEC extern char *mca_base_user_default_path; /* * Public functions @@ -145,17 +148,45 @@ OPAL_DECLSPEC char * mca_base_component_to_string(const mca_base_component_t *a) OPAL_DECLSPEC int mca_base_component_find(const char *directory, const char *type, const mca_base_component_t *static_components[], - char **requested_component_names, - bool include_mode, + const char *requested_components, opal_list_t *found_components, bool open_dso_components); +/** + * Filter a list of components based on a comma-delimted list of names and/or + * a set of meta-data flags. + * + * @param[in,out] components List of components to filter + * @param[in] output_id Output id to write to for error/warning/debug messages + * @param[in] filter_names Comma delimited list of components to use. Negate with ^. + * May be NULL. + * @param[in] filter_flags Metadata flags components are required to have set (CR ready) + * + * @returns OPAL_SUCCESS On success + * @returns OPAL_ERR_NOT_FOUND If some component in {filter_names} is not found in + * {components}. Does not apply to negated filters. + * @returns opal error code On other error. + * + * This function closes and releases any components that do not match the filter_name and + * filter flags. + */ +OPAL_DECLSPEC int mca_base_components_filter (const char *framework_name, opal_list_t *components, int output_id, + const char *filter_names, uint32_t filter_flags); + + + /* Safely release some memory allocated by mca_base_component_find() (i.e., is safe to call even if you never called mca_base_component_find()). */ OPAL_DECLSPEC int mca_base_component_find_finalize(void); +/* mca_base_components_register.c */ +OPAL_DECLSPEC int mca_base_framework_components_register (struct mca_base_framework_t *framework, + mca_base_register_flag_t flags); + /* mca_base_components_open.c */ +OPAL_DECLSPEC int mca_base_framework_components_open (struct mca_base_framework_t *framework, + mca_base_open_flag_t flags); OPAL_DECLSPEC int mca_base_components_open(const char *type_name, int output_id, const mca_base_component_t **static_components, @@ -163,13 +194,22 @@ OPAL_DECLSPEC int mca_base_components_open(const char *type_name, int output_id, bool open_dso_components); /* mca_base_components_close.c */ - -int mca_base_component_release (int output_id, const mca_base_component_t *component, - bool opened); +/** + * Close and release a component. + * + * @param[in] component Component to close + * @param[in] output_id Output id for debugging output + * + * After calling this function the component may no longer be used. + */ +OPAL_DECLSPEC void mca_base_component_close (const mca_base_component_t *component, int output_id); OPAL_DECLSPEC int mca_base_components_close(int output_id, opal_list_t *components_available, const mca_base_component_t *skip); +OPAL_DECLSPEC int mca_base_framework_components_close (struct mca_base_framework_t *framework, + const mca_base_component_t *skip); + END_C_DECLS #endif /* MCA_BASE_H */ diff --git a/opal/mca/base/mca_base_component_find.c b/opal/mca/base/mca_base_component_find.c index dba5c3edae..57d5549c16 100644 --- a/opal/mca/base/mca_base_component_find.c +++ b/opal/mca/base/mca_base_component_find.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology @@ -130,10 +131,28 @@ static char **found_filenames = NULL; static char *last_path_to_use = NULL; #endif /* OPAL_WANT_LIBLTDL */ +static int component_find_check (const char *framework_name, char **requested_component_names, opal_list_t *components); + +/* + * Dummy structure for casting for open_only logic + */ +struct mca_base_open_only_dummy_component_t { + /** MCA base component */ + mca_base_component_t version; + /** MCA base data */ + mca_base_component_data_t data; +}; +typedef struct mca_base_open_only_dummy_component_t mca_base_open_only_dummy_component_t; + +static char negate[] = "^"; + static bool use_component(const bool include_mode, const char **requested_component_names, const char *component_name); +static int parse_requested (const char *requested, bool *include_mode, + char ***requested_component_names); + /* * Function to find as many components of a given type as possible. This @@ -146,14 +165,20 @@ static bool use_component(const bool include_mode, */ int mca_base_component_find(const char *directory, const char *type, const mca_base_component_t *static_components[], - char **requested_component_names, - bool include_mode, + const char *requested_components, opal_list_t *found_components, bool open_dso_components) { - int i; - opal_list_item_t *item; + char **requested_component_names = NULL; mca_base_component_list_item_t *cli; + bool include_mode; + int i, ret; + + ret = parse_requested (requested_components, &include_mode, + &requested_component_names); + if (OPAL_SUCCESS != ret) { + return ret; + } /* Find all the components that were statically linked in */ OBJ_CONSTRUCT(found_components, opal_list_t); @@ -164,7 +189,8 @@ int mca_base_component_find(const char *directory, const char *type, static_components[i]->mca_component_name) ) { cli = OBJ_NEW(mca_base_component_list_item_t); if (NULL == cli) { - return OPAL_ERR_OUT_OF_RESOURCE; + ret = OPAL_ERR_OUT_OF_RESOURCE; + goto component_find_out; } cli->cli_component = static_components[i]; opal_list_append(found_components, (opal_list_item_t *) cli); @@ -184,33 +210,24 @@ int mca_base_component_find(const char *directory, const char *type, } #endif - /* Ensure that *all* requested components exist. Print a warning - and abort if they do not. */ - for (i = 0; include_mode && NULL != requested_component_names && - NULL != requested_component_names[i]; ++i) { - for (item = opal_list_get_first(found_components); - opal_list_get_end(found_components) != item; - item = opal_list_get_next(item)) { - cli = (mca_base_component_list_item_t*) item; - if (0 == strcmp(requested_component_names[i], - cli->cli_component->mca_component_name)) { - break; - } - } + if (include_mode) { + ret = component_find_check (type, requested_component_names, found_components); + } else { + ret = OPAL_SUCCESS; + } - if (opal_list_get_end(found_components) == item) { - char h[MAXHOSTNAMELEN]; - gethostname(h, sizeof(h)); - opal_show_help("help-mca-base.txt", - "find-available:not-valid", true, - h, type, requested_component_names[i]); - return OPAL_ERR_NOT_FOUND; - } + + ret = OPAL_SUCCESS; + +component_find_out: + + if (NULL != requested_component_names) { + opal_argv_free(requested_component_names); } /* All done */ - return OPAL_SUCCESS; + return ret; } int mca_base_component_find_finalize(void) @@ -228,6 +245,71 @@ int mca_base_component_find_finalize(void) return OPAL_SUCCESS; } +int mca_base_components_filter (const char *framework_name, opal_list_t *components, int output_id, + const char *filter_names, uint32_t filter_flags) +{ + mca_base_component_list_item_t *cli, *next; + char **requested_component_names = NULL; + bool include_mode, can_use; + int ret; + + assert (NULL != components); + + if (0 == filter_flags && NULL == filter_names) { + return OPAL_SUCCESS; + } + + ret = parse_requested (filter_names, &include_mode, + &requested_component_names); + if (OPAL_SUCCESS != ret) { + return ret; + } + + OPAL_LIST_FOREACH_SAFE(cli, next, components, mca_base_component_list_item_t) { + const mca_base_component_t *component = cli->cli_component; + mca_base_open_only_dummy_component_t *dummy = + (mca_base_open_only_dummy_component_t *) cli->cli_component; + + can_use = use_component (include_mode, (const char **) requested_component_names, + cli->cli_component->mca_component_name); + + if (!can_use || (filter_flags & dummy->data.param_field) != filter_flags) { + if (can_use && (filter_flags & MCA_BASE_METADATA_PARAM_CHECKPOINT) && + !(MCA_BASE_METADATA_PARAM_CHECKPOINT & dummy->data.param_field)) { + opal_output_verbose(10, output_id, + "mca: base: components_filter: " + "(%s) Component %s is *NOT* Checkpointable - Disabled", + component->reserved, + component->mca_component_name); + } + + opal_list_remove_item (components, &cli->super); + + mca_base_component_close (component, output_id); + + OBJ_RELEASE(cli); + } else if (filter_flags & MCA_BASE_METADATA_PARAM_CHECKPOINT) { + opal_output_verbose(10, output_id, + "mca: base: components_filter: " + "(%s) Component %s is Checkpointable", + component->reserved, + component->mca_component_name); + } + } + + if (include_mode) { + ret = component_find_check (framework_name, requested_component_names, components); + } else { + ret = OPAL_SUCCESS; + } + + if (NULL != requested_component_names) { + opal_argv_free (requested_component_names); + } + + return ret; +} + #if OPAL_WANT_LIBLTDL /* @@ -246,7 +328,7 @@ static void find_dyn_components(const char *path, const char *type_name, opal_list_t *found_components) { int i, len; - char *path_to_use, *dir, *end; + char *path_to_use = NULL, *dir, *end; component_file_item_t *file; opal_list_item_t *cur; char prefix[32 + MCA_BASE_MAX_TYPE_NAME_LEN], *basename; @@ -257,7 +339,7 @@ static void find_dyn_components(const char *path, const char *type_name, if (NULL == path) { if (NULL != mca_base_component_path) { - path_to_use = strdup(mca_base_component_path); + path_to_use = strdup (mca_base_component_path); } else { /* If there's no path, then there's nothing to search -- we're done */ @@ -443,6 +525,7 @@ static int open_component(component_file_item_t *target_file, opal_output_verbose(40, 0, "mca: base: component_find: examining dyanmic %s MCA component \"%s\"", target_file->type, target_file->name); opal_output_verbose(40, 0, "mca: base: component_find: %s", target_file->filename); + vl = mca_base_component_show_load_errors ? 0 : 40; /* Was this component already loaded (e.g., via dependency)? */ @@ -903,11 +986,72 @@ static bool use_component(const bool include_mode, * As xor is a binary operator let's implement it manually before * a compiler screws it up. */ - if ( (include_mode && found) || !(include_mode || found) ) { - return true; - } else { - return false; - } + + return (include_mode && found) || !(include_mode || found); } +/* Ensure that *all* requested components exist. Print a warning + and abort if they do not. */ +static int component_find_check (const char *framework_name, char **requested_component_names, opal_list_t *components) +{ + mca_base_component_list_item_t *cli; + int i; + for (i = 0; NULL != requested_component_names && + NULL != requested_component_names[i]; ++i) { + bool found = false; + + OPAL_LIST_FOREACH(cli, components, mca_base_component_list_item_t) { + if (0 == strcmp(requested_component_names[i], + cli->cli_component->mca_component_name)) { + found = true; + break; + } + } + + if (!found) { + char h[MAXHOSTNAMELEN]; + gethostname(h, sizeof(h)); + opal_show_help("help-mca-base.txt", + "find-available:not-valid", true, + h, framework_name, requested_component_names[i]); + return OPAL_ERR_NOT_FOUND; + } + } + + return OPAL_SUCCESS; +} + +static int parse_requested (const char *requested, bool *include_mode, + char ***requested_component_names) +{ + const char *requested_orig = requested; + + *requested_component_names = NULL; + *include_mode = true; + + /* See if the user requested anything */ + if (NULL == requested || 0 == strlen (requested)) { + return OPAL_SUCCESS; + } + + /* Are we including or excluding? We only allow the negate + character to be the *first* character of the value (but be nice + and allow any number of negate characters in the beginning). */ + requested += strspn (requested, negate); + + /* Double check to ensure that the user did not specify the negate + character anywhere else in the value. */ + if (NULL != strstr (requested, negate)) { + opal_show_help("help-mca-base.txt", + "framework-param:too-many-negates", + true, requested_orig); + return OPAL_ERROR; + } + + /* Split up the value into individual component names */ + *requested_component_names = opal_argv_split(requested, ','); + + /* All done */ + return OPAL_SUCCESS; +} diff --git a/opal/mca/base/mca_base_components_close.c b/opal/mca/base/mca_base_components_close.c index b243435f5b..a3570a4b6d 100644 --- a/opal/mca/base/mca_base_components_close.c +++ b/opal/mca/base/mca_base_components_close.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana * University Research and Technology @@ -9,6 +10,8 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2013 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -25,13 +28,12 @@ #include "opal/mca/base/mca_base_component_repository.h" #include "opal/constants.h" -int mca_base_component_release (int output_id, const mca_base_component_t *component, - bool opened) +void mca_base_component_close (const mca_base_component_t *component, int output_id) { - int group_id; + int ret; /* Close */ - if (opened && NULL != component->mca_close_component) { + if (NULL != component->mca_close_component) { component->mca_close_component(); opal_output_verbose(10, output_id, "mca: base: close: component %s closed", @@ -39,54 +41,49 @@ int mca_base_component_release (int output_id, const mca_base_component_t *compo } /* Unload */ - - /* Deregister this group before the component goes away */ - group_id = mca_base_var_group_find (NULL, component->mca_type_name, - component->mca_component_name); - mca_base_var_group_deregister (group_id); - opal_output_verbose(10, output_id, "mca: base: close: unloading component %s", component->mca_component_name); - mca_base_component_repository_release((mca_base_component_t *) component); - return OPAL_SUCCESS; + /* XXX -- TODO -- Replace reserved by mca_project_name for 1.9 */ + ret = mca_base_var_group_find (component->reserved, component->mca_type_name, + component->mca_component_name); + if (0 <= ret) { + mca_base_var_group_deregister (ret); + } + + mca_base_component_repository_release((mca_base_component_t *) component); } -int mca_base_components_close(int output_id, - opal_list_t *components_available, +int mca_base_framework_components_close (mca_base_framework_t *framework, + const mca_base_component_t *skip) +{ + return mca_base_components_close (framework->framework_output, + &framework->framework_components, + skip); +} + +int mca_base_components_close(int output_id, opal_list_t *components, const mca_base_component_t *skip) { - opal_list_item_t *item; - mca_base_component_priority_list_item_t *pcli, *skipped_pcli = NULL; - const mca_base_component_t *component; + mca_base_component_list_item_t *cli, *next; - /* Close and unload all components in the available list, except the - "skip" item. This is handy to close out all non-selected - components. It's easier to simply remove the entire list and - then simply re-add the skip entry when done. */ + /* Close and unload all components in the available list, except the + "skip" item. This is handy to close out all non-selected + components. It's easier to simply remove the entire list and + then simply re-add the skip entry when done. */ - for (item = opal_list_remove_first(components_available); - NULL != item; - item = opal_list_remove_first(components_available)) { - pcli = (mca_base_component_priority_list_item_t *) item; - component = pcli->super.cli_component; + OPAL_LIST_FOREACH_SAFE(cli, next, components, mca_base_component_list_item_t) { + if (skip == cli->cli_component) { + continue; + } - if (component != skip) { - mca_base_component_release (output_id, component, true); - free(pcli); - } else { - skipped_pcli = pcli; + mca_base_component_close (cli->cli_component, output_id); + opal_list_remove_item (components, &cli->super); + + OBJ_RELEASE(cli); } - } - /* If we found it, re-add the skipped component to the available - list (see above comment) */ - - if (NULL != skipped_pcli) { - opal_list_append(components_available, (opal_list_item_t *) skipped_pcli); - } - - /* All done */ - return OPAL_SUCCESS; + /* All done */ + return OPAL_SUCCESS; } diff --git a/opal/mca/base/mca_base_components_open.c b/opal/mca/base/mca_base_components_open.c index e40fdb1d14..e46e0f316b 100644 --- a/opal/mca/base/mca_base_components_open.c +++ b/opal/mca/base/mca_base_components_open.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana * University Research and Technology @@ -10,7 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2008-2012 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2011-2012 Los Alamos National Security, LLC. + * Copyright (c) 2011-2013 Los Alamos National Security, LLC. * All rights reserved. * $COPYRIGHT$ * @@ -28,129 +29,104 @@ #include "opal/class/opal_list.h" #include "opal/util/argv.h" #include "opal/util/output.h" -#include "opal/util/show_help.h" #include "opal/mca/mca.h" #include "opal/mca/base/base.h" -#include "opal/mca/base/mca_base_component_repository.h" #include "opal/constants.h" -struct component_name_t { - opal_list_item_t super; - - char mn_name[MCA_BASE_MAX_COMPONENT_NAME_LEN]; -}; -typedef struct component_name_t component_name_t; - -/* - * Dummy structure for casting for open_only logic - */ -struct mca_base_open_only_dummy_component_t { - /** MCA base component */ - mca_base_component_t version; - /** MCA base data */ - mca_base_component_data_t data; -}; -typedef struct mca_base_open_only_dummy_component_t mca_base_open_only_dummy_component_t; - -/* - * Local variables - */ -static bool show_errors = false; -static const char negate = '^'; - - /* * Local functions */ -static int parse_requested(int mca_param, bool *include_mode, - char ***requested_component_names); -static int open_components(const char *type_name, int output_id, - opal_list_t *src, opal_list_t *dest); +static int open_components(mca_base_framework_t *framework); + +struct mca_base_dummy_framework_list_item_t { + opal_list_item_t super; + mca_base_framework_t framework; +}; /** * Function for finding and opening either all MCA components, or the * one that was specifically requested via a MCA parameter. */ -int mca_base_components_open(const char *type_name, int output_id, - const mca_base_component_t **static_components, - opal_list_t *components_available, - bool open_dso_components) +int mca_base_framework_components_open (mca_base_framework_t *framework, + mca_base_open_flag_t flags) { - int ret, param; - opal_list_item_t *item; - opal_list_t components_found; - char **requested_component_names; - int param_verbose = -1; - int param_type = -1; - int verbose_level; - char *str; - bool include_mode; -#if (OPAL_ENABLE_FT == 1) && (OPAL_ENABLE_FT_CR == 1) - opal_list_item_t *next; - uint32_t open_only_flags = MCA_BASE_METADATA_PARAM_NONE; - const mca_base_component_t *component; -#endif - - /* Register MCA parameters */ - /* Check to see if it exists first */ - if( 0 > (param_type = mca_base_param_find(type_name, NULL, NULL) ) ) { - asprintf(&str, "Default selection set of components for the %s framework (" - " means use all components that can be found)", type_name); - param_type = - mca_base_param_reg_string_name(type_name, NULL, str, - false, false, NULL, NULL); - free(str); - } - - param = mca_base_param_find("mca", NULL, "component_show_load_errors"); - mca_base_param_lookup_int(param, &ret); - show_errors = OPAL_INT_TO_BOOL(ret); - - /* Setup verbosity for this MCA type */ - asprintf(&str, "Verbosity level for the %s framework (0 = no verbosity)", type_name); - param_verbose = - mca_base_param_reg_int_name(type_name, "base_verbose", - str, false, false, 0, NULL); - free(str); - mca_base_param_lookup_int(param_verbose, &verbose_level); - if (output_id != 0) { - opal_output_set_verbosity(output_id, verbose_level); - } - opal_output_verbose(10, output_id, - "mca: base: components_open: Looking for %s components", - type_name); - - ret = parse_requested(param_type, &include_mode, &requested_component_names); - if( OPAL_SUCCESS != ret ) { - return ret; - } - - /* Find and load requested components */ - if (OPAL_SUCCESS != (ret = - mca_base_component_find(NULL, type_name, static_components, - requested_component_names, include_mode, - &components_found, open_dso_components)) ) { - return ret; - } - -#if (OPAL_ENABLE_FT == 1) && (OPAL_ENABLE_FT_CR == 1) - { - int param_id = -1; - int param_val = 0; - /* - * Extract supported mca parameters for selection contraints - * Supported Options: - * - mca_base_component_distill_checkpoint_ready = Checkpoint Ready - */ - param_id = mca_base_param_reg_int_name("mca", "base_component_distill_checkpoint_ready", - "Distill only those components that are Checkpoint Ready", - false, false, - 0, ¶m_val); - if( 0 != param_val ) { /* Select Checkpoint Ready */ - open_only_flags |= MCA_BASE_METADATA_PARAM_CHECKPOINT; + /* Open flags are not used at this time. Suppress compiler warning. */ + if (flags & MCA_BASE_OPEN_FIND_COMPONENTS) { + /* Find and load requested components */ + int ret = mca_base_component_find(NULL, framework->framework_name, + framework->framework_static_components, + framework->framework_selection, + &framework->framework_components, true); + if (OPAL_SUCCESS != ret) { + return ret; } } -#endif /* (OPAL_ENABLE_FT == 1) && (OPAL_ENABLE_FT_CR == 1) */ + + /* Open all registered components */ + return open_components (framework); +} + +int mca_base_components_open (const char *type_name, int output_id, + const mca_base_component_t **static_components, + opal_list_t *components_available, + bool open_dso_components) +{ + /* create a dummy framework -- this leaks -- i know -- but it is temporary */ + mca_base_register_flag_t register_flags; + mca_base_framework_t *dummy_framework; + opal_list_item_t *item; + int ret; + + dummy_framework = calloc (1, sizeof(*dummy_framework)); + + dummy_framework->framework_static_components = static_components; + dummy_framework->framework_output = output_id; + dummy_framework->framework_name = strdup(type_name); + + if (open_dso_components) { + register_flags = MCA_BASE_REGISTER_STATIC_ONLY; + } else { + register_flags = MCA_BASE_REGISTER_DEFAULT; + } + + ret = mca_base_framework_components_register (dummy_framework, register_flags); + if (OPAL_SUCCESS != ret) { + free (dummy_framework); + return ret; + } + + ret = mca_base_framework_components_open (dummy_framework, 0); + if (OPAL_SUCCESS != ret) { + (void) mca_base_framework_components_close (dummy_framework, NULL); + free (dummy_framework); + return ret; + } + + OBJ_CONSTRUCT(components_available, opal_list_t); + + while (NULL != (item = opal_list_remove_first(&dummy_framework->framework_components))) { + opal_list_append(components_available, item); + } + + OBJ_DESTRUCT(&dummy_framework->framework_components); + + return OPAL_SUCCESS; +} + +/* + * Traverse the entire list of found components (a list of + * mca_base_component_t instances). If the requested_component_names + * array is empty, or the name of each component in the list of found + * components is in the requested_components_array, try to open it. + * If it opens, add it to the components_available list. + */ +static int open_components(mca_base_framework_t *framework) +{ + opal_list_t *components = &framework->framework_components; + uint32_t open_only_flags = MCA_BASE_METADATA_PARAM_NONE; + int output_id = framework->framework_output; + mca_base_component_list_item_t *cli, *next; + int ret; /* * Pre-process the list with parameter constraints @@ -161,316 +137,77 @@ int mca_base_components_open(const char *type_name, int output_id, * functionality. If other component constraint options are * added, then this logic can be used for all contraint * options. + * + * NTH: Logic moved to mca_base_components_filter. */ #if (OPAL_ENABLE_FT == 1) && (OPAL_ENABLE_FT_CR == 1) - if( !(MCA_BASE_METADATA_PARAM_NONE & open_only_flags) ) { - if( MCA_BASE_METADATA_PARAM_CHECKPOINT & open_only_flags) { - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "including only %s components that are checkpoint enabled", type_name); - } - - /* - * Check all the components to make sure they adhere to the user - * expressed requirements. - */ - for(item = opal_list_get_first(&components_found); - item != opal_list_get_end(&components_found); - item = next ) { - mca_base_open_only_dummy_component_t *dummy; - mca_base_component_list_item_t *cli = (mca_base_component_list_item_t *) item; - dummy = (mca_base_open_only_dummy_component_t*) cli->cli_component; - component = cli->cli_component; - - next = opal_list_get_next(item); - - /* - * If the user asked for a checkpoint enabled run - * then only load checkpoint enabled components. - */ - if( MCA_BASE_METADATA_PARAM_CHECKPOINT & open_only_flags) { - if( MCA_BASE_METADATA_PARAM_CHECKPOINT & dummy->data.param_field) { - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "(%s) Component %s is Checkpointable", - type_name, - dummy->version.mca_component_name); - } - else { - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "(%s) Component %s is *NOT* Checkpointable - Disabled", - type_name, - dummy->version.mca_component_name); - opal_list_remove_item(&components_found, item); - /* Make sure to release the component since we are not - * opening it */ - mca_base_component_repository_release(component); - } - } - } + if (mca_base_component_distill_checkpoint_ready) { + open_only_flags |= MCA_BASE_METADATA_PARAM_CHECKPOINT; } #endif /* (OPAL_ENABLE_FT == 1) && (OPAL_ENABLE_FT_CR == 1) */ - /* Open all remaining components */ - ret = open_components(type_name, output_id, - &components_found, components_available); - - /* Free resources */ - for (item = opal_list_remove_first(&components_found); NULL != item; - item = opal_list_remove_first(&components_found)) { - OBJ_RELEASE(item); - } - OBJ_DESTRUCT(&components_found); - - if (NULL != requested_component_names) { - opal_argv_free(requested_component_names); + /* If mca_base_framework_register_components was called with the MCA_BASE_COMPONENTS_ALL flag + we need to trim down and close any extra components we do not want open */ + ret = mca_base_components_filter (framework->framework_name, &framework->framework_components, + framework->framework_output, framework->framework_selection, + open_only_flags); + if (OPAL_SUCCESS != ret) { + return ret; } - /* All done */ - return ret; -} - -int mca_base_is_component_required(opal_list_t *components_available, - mca_base_component_t *component, - bool exclusive, - bool *is_required) -{ - opal_list_item_t *item = NULL; - mca_base_component_list_item_t *cli = NULL; - mca_base_component_t *comp = NULL; - - /* Sanity check */ - if( NULL == components_available || - NULL == component) { - return OPAL_ERR_BAD_PARAM; - } - - *is_required = false; - - /* - * Look through the components available for opening - */ - if( exclusive ) { - /* Must be the -only- component in the list */ - if( 1 == opal_list_get_size(components_available) ) { - item = opal_list_get_first(components_available); - cli = (mca_base_component_list_item_t *) item; - comp = (mca_base_component_t *) cli->cli_component; - - if( 0 == strncmp(comp->mca_component_name, - component->mca_component_name, - strlen(component->mca_component_name)) ) { - *is_required = true; - return OPAL_SUCCESS; - } - } - } - else { - /* Must be one of the components in the list */ - for (item = opal_list_get_first(components_available); - item != opal_list_get_end(components_available); - item = opal_list_get_next(item) ) { - cli = (mca_base_component_list_item_t *) item; - comp = (mca_base_component_t *) cli->cli_component; - - if( 0 == strncmp(comp->mca_component_name, - component->mca_component_name, - strlen(component->mca_component_name)) ) { - *is_required = true; - return OPAL_SUCCESS; - } - } - } - - return OPAL_SUCCESS; -} - - -static int parse_requested(int mca_param, bool *include_mode, - char ***requested_component_names) -{ - int i; - char *requested, *requested_orig; - - *requested_component_names = NULL; - *include_mode = true; - - /* See if the user requested anything */ - - if (0 > mca_base_param_lookup_string(mca_param, &requested)) { - return OPAL_ERROR; - } - if (NULL == requested || 0 == strlen(requested)) { - return OPAL_SUCCESS; - } - requested_orig = requested; - - /* Are we including or excluding? We only allow the negate - character to be the *first* character of the value (but be nice - and allow any number of negate characters in the beginning). */ - - while (negate == requested[0] && '\0' != requested[0]) { - *include_mode = false; - ++requested; - } - - /* Double check to ensure that the user did not specify the negate - character anywhere else in the value. */ - - i = 0; - while ('\0' != requested[i]) { - if (negate == requested[i]) { - opal_show_help("help-mca-base.txt", - "framework-param:too-many-negates", - true, requested_orig); - free(requested_orig); - return OPAL_ERROR; - } - ++i; - } - - /* Split up the value into individual component names */ - - *requested_component_names = opal_argv_split(requested, ','); - - /* All done */ - - free(requested_orig); - return OPAL_SUCCESS; -} - - -/* - * Traverse the entire list of found components (a list of - * mca_base_component_t instances). If the requested_component_names - * array is empty, or the name of each component in the list of found - * components is in the requested_components_array, try to open it. - * If it opens, add it to the components_available list. - */ -static int open_components(const char *type_name, int output_id, - opal_list_t *src, opal_list_t *dest) -{ - int ret; - opal_list_item_t *item; - const mca_base_component_t *component; - mca_base_component_list_item_t *cli; - bool called_open; - bool opened; - /* Announce */ - opal_output_verbose(10, output_id, "mca: base: components_open: opening %s components", - type_name); + framework->framework_name); - /* Traverse the list of found components */ - - OBJ_CONSTRUCT(dest, opal_list_t); - for (item = opal_list_get_first(src); - opal_list_get_end(src) != item; - item = opal_list_get_next(item)) { - cli = (mca_base_component_list_item_t *) item; - component = cli->cli_component; + /* Traverse the list of components */ + OPAL_LIST_FOREACH_SAFE(cli, next, components, mca_base_component_list_item_t) { + const mca_base_component_t *component = cli->cli_component; - opened = called_open = false; opal_output_verbose(10, output_id, "mca: base: components_open: found loaded component %s", component->mca_component_name); - /* Call the component's MCA parameter registration function */ - if (NULL == component->mca_register_component_params) { - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "component %s has no register function", - component->mca_component_name); - } else { - ret = component->mca_register_component_params(); - if (OPAL_SUCCESS == ret) { - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "component %s register function successful", - component->mca_component_name); - } else if (OPAL_ERR_NOT_AVAILABLE != ret) { - /* If the component returns OPAL_ERR_NOT_AVAILABLE, - it's a cue to "silently ignore me" -- it's not a - failure, it's just a way for the component to say - "nope!". - - Otherwise, however, display an error. We may end - up displaying this twice, but it may go to separate - streams. So better to be redundant than to not - display the error in the stream where it was - expected. */ - - if (show_errors) { - opal_output(0, "mca: base: components_open: " - "component %s / %s register function failed", - component->mca_type_name, - component->mca_component_name); - } - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "component %s register function failed", - component->mca_component_name); - } - } - - if (NULL == component->mca_open_component) { - opened = true; - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "component %s has no open function", - component->mca_component_name); - } else { - called_open = true; + if (NULL != component->mca_open_component) { + /* Call open if register didn't call it already */ ret = component->mca_open_component(); + if (OPAL_SUCCESS == ret) { - opened = true; opal_output_verbose(10, output_id, "mca: base: components_open: " "component %s open function successful", component->mca_component_name); - } else if (OPAL_ERR_NOT_AVAILABLE != ret) { - /* If the component returns OPAL_ERR_NOT_AVAILABLE, - it's a cue to "silently ignore me" -- it's not a - failure, it's just a way for the component to say - "nope!". + } else { + if (OPAL_ERR_NOT_AVAILABLE != ret) { + /* If the component returns OPAL_ERR_NOT_AVAILABLE, + it's a cue to "silently ignore me" -- it's not a + failure, it's just a way for the component to say + "nope!". - Otherwise, however, display an error. We may end - up displaying this twice, but it may go to separate - streams. So better to be redundant than to not - display the error in the stream where it was - expected. */ + Otherwise, however, display an error. We may end + up displaying this twice, but it may go to separate + streams. So better to be redundant than to not + display the error in the stream where it was + expected. */ - if (show_errors) { - opal_output(0, "mca: base: components_open: " - "component %s / %s open function failed", - component->mca_type_name, - component->mca_component_name); - } - opal_output_verbose(10, output_id, - "mca: base: components_open: " - "component %s open function failed", - component->mca_component_name); - } - } - - /* If it didn't open, close it out and get rid of it */ - - if (!opened) { - mca_base_component_release (output_id, component, called_open); - continue; - } + if (mca_base_component_show_load_errors) { + opal_output(0, "mca: base: components_open: " + "component %s / %s open function failed", + component->mca_type_name, + component->mca_component_name); + } + opal_output_verbose(10, output_id, + "mca: base: components_open: " + "component %s open function failed", + component->mca_component_name); + } - /* Not all components register a priority. Do not register one here. */ - - cli = OBJ_NEW(mca_base_component_list_item_t); - if (NULL == cli) { - return OPAL_ERR_OUT_OF_RESOURCE; - } - cli->cli_component = component; - opal_list_append(dest, (opal_list_item_t *) cli); + mca_base_component_close (component, output_id); + + opal_list_remove_item (components, &cli->super); + OBJ_RELEASE(cli); + } + } } /* All done */ diff --git a/opal/mca/base/mca_base_components_register.c b/opal/mca/base/mca_base_components_register.c new file mode 100644 index 0000000000..835ca240d6 --- /dev/null +++ b/opal/mca/base/mca_base_components_register.c @@ -0,0 +1,178 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2004-2008 The Trustees of Indiana University and Indiana + * University Research and Technology + * Corporation. All rights reserved. + * Copyright (c) 2004-2012 The University of Tennessee and The University + * of Tennessee Research Foundation. All rights + * reserved. + * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, + * University of Stuttgart. All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * Copyright (c) 2008-2012 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2011-2013 Los Alamos National Security, LLC. + * All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "opal_config.h" + +#include +#include +#include + +#include "opal/class/opal_list.h" +#include "opal/util/argv.h" +#include "opal/util/output.h" +#include "opal/util/show_help.h" +#include "opal/mca/mca.h" +#include "opal/mca/base/base.h" +#include "opal/mca/base/mca_base_framework.h" +#include "opal/mca/base/mca_base_component_repository.h" +#include "opal/constants.h" + +/* + * Local functions + */ +static int register_components(const char *project_name, const char *type_name, + int output_id, opal_list_t *src, opal_list_t *dest); +/** + * Function for finding and opening either all MCA components, or the + * one that was specifically requested via a MCA parameter. + */ +int mca_base_framework_components_register (mca_base_framework_t *framework, + mca_base_register_flag_t flags) +{ + bool open_dso_components = !(flags & MCA_BASE_REGISTER_STATIC_ONLY); + bool ignore_requested = !!(flags & MCA_BASE_REGISTER_ALL); + opal_list_t components_found; + int ret; + + /* Find and load requested components */ + ret = mca_base_component_find(NULL, framework->framework_name, + framework->framework_static_components, + ignore_requested ? NULL : framework->framework_selection, + &components_found, open_dso_components); + + if (OPAL_SUCCESS != ret) { + return ret; + } + + /* Register all remaining components */ + ret = register_components(framework->framework_project, framework->framework_name, + framework->framework_output, &components_found, + &framework->framework_components); + + OBJ_DESTRUCT(&components_found); + + /* All done */ + return ret; +} + +/* + * Traverse the entire list of found components (a list of + * mca_base_component_t instances). If the requested_component_names + * array is empty, or the name of each component in the list of found + * components is in the requested_components_array, try to open it. + * If it opens, add it to the components_available list. + */ +static int register_components(const char *project_name, const char *type_name, + int output_id, opal_list_t *src, opal_list_t *dest) +{ + int ret; + opal_list_item_t *item; + mca_base_component_t *component; + mca_base_component_list_item_t *cli; + + /* Announce */ + opal_output_verbose(10, output_id, + "mca: base: components_register: registering %s components", + type_name); + + /* Traverse the list of found components */ + + OBJ_CONSTRUCT(dest, opal_list_t); + while (NULL != (item = opal_list_remove_first (src))) { + cli = (mca_base_component_list_item_t *) item; + component = (mca_base_component_t *)cli->cli_component; + + opal_output_verbose(10, output_id, + "mca: base: components_register: found loaded component %s", + component->mca_component_name); + + /* Call the component's MCA parameter registration function (or open if register doesn't exist) */ + if (NULL == component->mca_register_component_params) { + opal_output_verbose(10, output_id, + "mca: base: components_register: " + "component %s has no register or open function", + component->mca_component_name); + ret = OPAL_SUCCESS; + } else { + ret = component->mca_register_component_params(); + } + + if (OPAL_SUCCESS != ret) { + if (OPAL_ERR_NOT_AVAILABLE != ret) { + /* If the component returns OPAL_ERR_NOT_AVAILABLE, + it's a cue to "silently ignore me" -- it's not a + failure, it's just a way for the component to say + "nope!". + + Otherwise, however, display an error. We may end + up displaying this twice, but it may go to separate + streams. So better to be redundant than to not + display the error in the stream where it was + expected. */ + + if (mca_base_component_show_load_errors) { + opal_output(0, "mca: base: components_register: " + "component %s / %s register function failed", + component->mca_type_name, + component->mca_component_name); + } + + opal_output_verbose(10, output_id, + "mca: base: components_register: " + "component %s register function failed", + component->mca_component_name); + } + + mca_base_component_close (component, output_id); + + /* Release this list item */ + OBJ_RELEASE(cli); + continue; + } + + if (NULL != component->mca_register_component_params) { + opal_output_verbose (10, output_id, "mca: base: components_register: " + "component %s register function successful", + component->mca_component_name); + } + + /* Register this component's version */ + mca_base_var_register (project_name, type_name, component->mca_component_name, "major_version", + NULL, MCA_BASE_VAR_TYPE_INT, NULL, 0, MCA_BASE_VAR_FLAG_DEFAULT_ONLY | + MCA_BASE_VAR_FLAG_INTERNAL, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_CONSTANT, + &component->mca_component_major_version); + mca_base_var_register (project_name, type_name, component->mca_component_name, "minor_version", + NULL, MCA_BASE_VAR_TYPE_INT, NULL, 0, MCA_BASE_VAR_FLAG_DEFAULT_ONLY | + MCA_BASE_VAR_FLAG_INTERNAL, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_CONSTANT, + &component->mca_component_minor_version); + mca_base_var_register (project_name, type_name, component->mca_component_name, "release_version", + NULL, MCA_BASE_VAR_TYPE_INT, NULL, 0, MCA_BASE_VAR_FLAG_DEFAULT_ONLY | + MCA_BASE_VAR_FLAG_INTERNAL, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_CONSTANT, + &component->mca_component_release_version); + + opal_list_append(dest, item); + } + + /* All done */ + + return OPAL_SUCCESS; +} diff --git a/opal/mca/base/mca_base_framework.c b/opal/mca/base/mca_base_framework.c new file mode 100644 index 0000000000..8a8c9dd63b --- /dev/null +++ b/opal/mca/base/mca_base_framework.c @@ -0,0 +1,201 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2012-2013 Los Alamos National Security, LLC. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "opal/include/opal_config.h" + +#include "opal/include/opal/constants.h" + +#include "mca_base_framework.h" +#include "mca_base_var.h" +#include "opal/mca/base/base.h" + +static bool framework_is_registered (struct mca_base_framework_t *framework) +{ + return !!(framework->framework_flags & MCA_BASE_FRAMEWORK_FLAG_REGISTERED); +} + +static void framework_open_output (struct mca_base_framework_t *framework) +{ + if (0 < framework->framework_verbose) { + if (-1 == framework->framework_output) { + framework->framework_output = opal_output_open (NULL); + } + opal_output_set_verbosity(framework->framework_output, + framework->framework_verbose); + } else if (-1 != framework->framework_output) { + opal_output_close (framework->framework_output); + framework->framework_output = -1; + } +} + +static void framework_close_output (struct mca_base_framework_t *framework) +{ + if (-1 != framework->framework_output) { + opal_output_close (framework->framework_output); + framework->framework_output = -1; + } +} + +int mca_base_framework_register (struct mca_base_framework_t *framework, + mca_base_register_flag_t flags) +{ + char *desc; + int ret; + + assert (NULL != framework); + + if (framework_is_registered (framework)) { + return OPAL_SUCCESS; + } + + if (!(MCA_BASE_FRAMEWORK_FLAG_NOREGISTER & framework->framework_flags)) { + /* register this framework with the MCA variable system */ + ret = mca_base_var_group_register (framework->framework_project, + framework->framework_name, + NULL, framework->framework_description); + if (0 > ret) { + return ret; + } + + asprintf (&desc, "Default selection set of components for the %s framework (" + " means use all components that can be found)", framework->framework_name); + ret = mca_base_var_register (framework->framework_project, framework->framework_name, + NULL, NULL, desc, MCA_BASE_VAR_TYPE_STRING, NULL, 0, + MCA_BASE_VAR_FLAG_SETTABLE, OPAL_INFO_LVL_2, + MCA_BASE_VAR_SCOPE_ALL_EQ, &framework->framework_selection); + free (desc); + if (0 > ret) { + return ret; + } + + /* register a verbosity variable for this framework */ + asprintf (&desc, "Verbosity level for the %s framework (0 = no verbosity)", + framework->framework_name); + ret = mca_base_framework_var_register (framework, "verbose", desc, + MCA_BASE_VAR_TYPE_INT, NULL, 0, + MCA_BASE_VAR_FLAG_SETTABLE, + OPAL_INFO_LVL_8, + MCA_BASE_VAR_SCOPE_LOCAL, + &framework->framework_verbose); + free(desc); + if (0 > ret) { + return ret; + } + + /* check the initial verbosity and open the output if necessary. we + will recheck this on open */ + framework_open_output (framework); + + /* register framework variables */ + if (NULL != framework->framework_register) { + ret = framework->framework_register (flags); + if (OPAL_SUCCESS != ret) { + return ret; + } + } + + /* register components variables */ + ret = mca_base_framework_components_register (framework, flags); + if (OPAL_SUCCESS != ret) { + return ret; + } + } + + framework->framework_flags |= MCA_BASE_FRAMEWORK_FLAG_REGISTERED; + + /* framework did not provide a register function */ + return OPAL_SUCCESS; +} + +int mca_base_framework_open (struct mca_base_framework_t *framework, + mca_base_open_flag_t flags) { + int ret; + + assert (NULL != framework); + + /* check if this framework is already open */ + if (framework->framework_refcnt++) { + return OPAL_SUCCESS; + } + + /* register this framework before opening it */ + ret = mca_base_framework_register (framework, MCA_BASE_REGISTER_DEFAULT); + if (OPAL_SUCCESS != ret) { + return ret; + } + + if (MCA_BASE_FRAMEWORK_FLAG_NOREGISTER & framework->framework_flags) { + flags |= MCA_BASE_OPEN_FIND_COMPONENTS; + } + + /* lock all of this frameworks's variables */ + ret = mca_base_var_group_find (framework->framework_project, + framework->framework_name, + NULL); + mca_base_var_group_set_var_flag (ret, MCA_BASE_VAR_FLAG_SETTABLE, false); + + /* check the verbosity level and open (or close) the output */ + framework_open_output (framework); + + if (NULL != framework->framework_open) { + ret = framework->framework_open (flags); + } else { + ret = mca_base_framework_components_open (framework, flags); + } + + if (OPAL_SUCCESS != ret) { + framework->framework_refcnt = 0; + } + + return ret; +} + +int mca_base_framework_close (struct mca_base_framework_t *framework) { + bool is_open = !!framework->framework_refcnt; + int ret, group_id; + + assert (NULL != framework); + + if (!framework_is_registered (framework) && 0 == framework->framework_refcnt) { + return OPAL_SUCCESS; + } + + if (framework->framework_refcnt && --framework->framework_refcnt) { + return OPAL_SUCCESS; + } + + /* find and deregister all component groups and variables */ + group_id = mca_base_var_group_find (framework->framework_project, + framework->framework_name, NULL); + if (0 <= group_id) { + ret = mca_base_var_group_deregister (group_id); + framework->framework_flags &= ~MCA_BASE_FRAMEWORK_FLAG_REGISTERED; + } + + /* close the framework and all of its components */ + if (is_open) { + if (NULL != framework->framework_close) { + ret = framework->framework_close (); + } else { + ret = mca_base_framework_components_close (framework, NULL); + } + + if (OPAL_SUCCESS != ret) { + return ret; + } + } else { + ret = OPAL_SUCCESS; + } + + framework_close_output (framework); + + return ret; +} diff --git a/opal/mca/base/mca_base_framework.h b/opal/mca/base/mca_base_framework.h new file mode 100644 index 0000000000..647debc145 --- /dev/null +++ b/opal/mca/base/mca_base_framework.h @@ -0,0 +1,214 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2012-2013 Los Alamos National Security, LLC. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#if !defined(OPAL_MCA_BASE_FRAMEWORK_H) +#define OPAL_MCA_BASE_FRAMEWORK_H + +#include "opal/mca/mca.h" +#include "opal/class/opal_list.h" + +/* + * Register and open flags + */ +enum mca_base_register_flag_t { + MCA_BASE_REGISTER_DEFAULT = 0, + /** Register all components (ignore selection MCA variables) */ + MCA_BASE_REGISTER_ALL = 1, + /** Do not register DSO components */ + MCA_BASE_REGISTER_STATIC_ONLY = 2 +}; + +typedef enum mca_base_register_flag_t mca_base_register_flag_t; + +enum mca_base_open_flag_t { + MCA_BASE_OPEN_DEFAULT = 0, + /** Find components in mca_base_components_find. Used by + mca_base_framework_open() when NOREGISTER is specified + by the framework */ + MCA_BASE_OPEN_FIND_COMPONENTS = 1, +}; + +typedef enum mca_base_open_flag_t mca_base_open_flag_t; + + +/** + * Register the MCA framework parameters + * + * @param[in] flags Registration flags (see mca/base/base.h) + * + * @retval OPAL_SUCCESS on success + * @retval opal error code on failure + * + * This function registers all framework MCA parameters. This + * function should not call mca_base_framework_components_register(). + * + * Frameworks are NOT required to provide this function. It + * may be NULL. + */ +typedef int (*mca_base_framework_register_params_fn_t) (mca_base_register_flag_t flags); + +/** + * Initialize the MCA framework + * + * @retval OPAL_SUCCESS Upon success + * @retval OPAL_ERROR Upon failure + * + * This must be the first function invoked in the MCA framework. + * It initializes the MCA framework, finds and opens components, + * populates the components list, etc. + * + * This function is invoked during opal_init() and during the + * initialization of the special case of the ompi_info command. + * + * This function fills in the components framework value, which + * is a list of all components that were successfully opened. + * This variable should \em only be used by other framework base + * functions or by ompi_info -- it is not considered a public + * interface member -- and is only mentioned here for completeness. + * + * Any resources allocated by this function must be freed + * in the framework close function. + * + * Frameworks are NOT required to provide this function. It may + * be NULL. If a framework does not provide an open function the + * default behavior of mca_base_framework_open() is to call + * mca_base_framework_components_open(). If a framework provides + * an open function it will need to call mca_base_framework_components_open() + * if it needs to open any components. + */ +typedef int (*mca_base_framework_open_fn_t) (mca_base_open_flag_t flags); + +/** + * Shut down the MCA framework. + * + * @retval OPAL_SUCCESS Always + * + * This function should shut downs everything in the MCA + * framework, and is called during opal_finalize() and the + * special case of the ompi_info command. + * + * It must be the last function invoked on the MCA framework. + * + * Frameworks are NOT required to provide this function. It may + * be NULL. If a framework does not provide a close function the + * default behavior of mca_base_framework_close() is to call + * mca_base_framework_components_close(). If a framework provide + * a close function it will need to call mca_base_framework_components_close() + * if any components were opened. + */ +typedef int (*mca_base_framework_close_fn_t) (void); + +typedef enum { + MCA_BASE_FRAMEWORK_FLAG_DEFAULT = 0, + /** Don't register any variables for this framework */ + MCA_BASE_FRAMEWORK_FLAG_NOREGISTER = 1, + /** Internal. Don't set outside mca_base_framework.h */ + MCA_BASE_FRAMEWORK_FLAG_REGISTERED = 2, + + /** + * The upper 16 bits are reserved for project specific flags. + */ +} mca_base_framework_flags_t; + +typedef struct mca_base_framework_t { + /** Project name for this component (ex "opal") */ + char *framework_project; + /** Framework name */ + char *framework_name; + /** Description of this framework or NULL */ + const char *framework_description; + /** Framework register function or NULL if the framework + and all its components have nothing to register */ + mca_base_framework_register_params_fn_t framework_register; + /** Framework open function or NULL */ + mca_base_framework_open_fn_t framework_open; + /** Framework close function or NULL */ + mca_base_framework_close_fn_t framework_close; + /** Framework flags (future use) set to 0 */ + mca_base_framework_flags_t framework_flags; + /** Framework open count */ + int framework_refcnt; + /** List of static components */ + const mca_base_component_t **framework_static_components; + /** Component selection. This will be registered with the MCA + variable system and should be either NULL (all components) or + a heap allocated, comma-delimited list of components. */ + char *framework_selection; + /** Verbosity level (0-100) */ + int framework_verbose; + /** Opal output for this framework (or -1) */ + int framework_output; + /** List of selected components (filled in by mca_base_framework_register() + or mca_base_framework_open() */ + opal_list_t framework_components; +} mca_base_framework_t; + + +/** + * Register a framework with MCA. + * + * @param[in] framework framework to register + * + * @retval OPAL_SUCCESS Upon success + * @retval OPAL_ERROR Upon failure + * + * Call a framework's register function. + */ +OPAL_DECLSPEC int mca_base_framework_register (mca_base_framework_t *framework, + mca_base_register_flag_t flags); + +/** + * Open a framework + * + * @param[in] framework framework to open + * + * @retval OPAL_SUCCESS Upon success + * @retval OPAL_ERROR Upon failure + * + * Call a framework's open function. + */ +OPAL_DECLSPEC int mca_base_framework_open (mca_base_framework_t *framework, + mca_base_open_flag_t flags); + +/** + * Close a framework + * + * @param[in] framework framework to close + * + * @retval OPAL_SUCCESS Upon success + * @retval OPAL_ERROR Upon failure + * + * Call a framework's close function. + */ +OPAL_DECLSPEC int mca_base_framework_close (mca_base_framework_t *framework); + +/** + * Macro to declare an MCA framework + * + * Example: + * MCA_BASE_FRAMEWORK_DECLARE(opal, foo, NULL, opal_foo_open, opal_foo_close, MCA_BASE_FRAMEWORK_FLAG_LAZY) + */ +#define MCA_BASE_FRAMEWORK_DECLARE(project, name, description, registerfn, openfn, closefn, static_components, flags) \ + mca_base_framework_t project##_##name##_base_framework = { \ + .framework_project = #project, \ + .framework_name = #name, \ + .framework_description = description, \ + .framework_register = registerfn, \ + .framework_open = openfn, \ + .framework_close = closefn, \ + .framework_flags = flags, \ + .framework_refcnt = 0, \ + .framework_static_components = static_components, \ + .framework_selection = NULL, \ + .framework_verbose = 0, \ + .framework_output = -1} + +#endif /* OPAL_MCA_BASE_FRAMEWORK_H */ diff --git a/opal/mca/base/mca_base_var.c b/opal/mca/base/mca_base_var.c index 5bc1df95c3..bf8d695035 100644 --- a/opal/mca/base/mca_base_var.c +++ b/opal/mca/base/mca_base_var.c @@ -526,6 +526,13 @@ int mca_base_var_group_deregister (int group_index) params = OPAL_VALUE_ARRAY_GET_BASE(&group->group_vars, int); for (i = 0 ; i < size ; ++i) { + mca_base_var_t *var; + + ret = var_get(params[i], &var, false); + if (OPAL_SUCCESS != ret || !(var->mbv_flags & MCA_BASE_VAR_FLAG_DWG)) { + continue; + } + (void) mca_base_var_deregister (params[i]); } OBJ_DESTRUCT(&group->group_vars); @@ -1536,7 +1543,21 @@ int mca_base_component_var_register (const mca_base_component_t *component, return mca_base_var_register (NULL, component->mca_type_name, component->mca_component_name, variable_name, description, type, enumerator, - bind, flags, info_lvl, scope, storage); + bind, flags | MCA_BASE_VAR_FLAG_DWG, + info_lvl, scope, storage); +} + +int mca_base_framework_var_register (const mca_base_framework_t *framework, + const char *variable_name, + const char *help_msg, mca_base_var_type_t type, + mca_base_var_enum_t *enumerator, int bind, + mca_base_var_flag_t flags, + mca_base_var_info_lvl_t info_level, + mca_base_var_scope_t scope, void *storage) +{ + return mca_base_var_register (framework->framework_project, framework->framework_name, + "base", variable_name, help_msg, type, enumerator, bind, + flags | MCA_BASE_VAR_FLAG_DWG, info_level, scope, storage); } int mca_base_var_register_synonym (int synonym_for, const char *project_name, diff --git a/opal/mca/base/mca_base_var.h b/opal/mca/base/mca_base_var.h index ab30df3ba7..c2212e0d73 100644 --- a/opal/mca/base/mca_base_var.h +++ b/opal/mca/base/mca_base_var.h @@ -64,6 +64,7 @@ #include "opal/class/opal_list.h" #include "opal/class/opal_value_array.h" #include "opal/mca/base/mca_base_var_enum.h" +#include "opal/mca/base/mca_base_framework.h" #include "opal/mca/mca.h" /** @@ -169,7 +170,10 @@ typedef enum { /** Variable has been overridden */ MCA_BASE_VAR_FLAG_OVERRIDE = 0x0010, /** Variable may not be set from a file */ - MCA_BASE_VAR_FLAG_ENVIRONMENT_ONLY = 0x0020 + MCA_BASE_VAR_FLAG_ENVIRONMENT_ONLY = 0x0020, + /** Variable should be deregistered when the group + is deregistered */ + MCA_BASE_VAR_FLAG_DWG = 0x0040 } mca_base_var_flag_t; @@ -514,6 +518,20 @@ OPAL_DECLSPEC int mca_base_component_var_register (const mca_base_component_t *c mca_base_var_info_lvl_t info_lvl, mca_base_var_scope_t scope, void *storage); +/** + * Convinience function for registering a variable associated with a framework. This + * function is equivalent to mca_base_var_register with component_name = "base" and + * with the MCA_BASE_VAR_FLAG_DWG set. See mca_base_var_register(). + */ +OPAL_DECLSPEC int mca_base_framework_var_register (const mca_base_framework_t *framework, + const char *variable_name, + const char *help_msg, mca_base_var_type_t type, + mca_base_var_enum_t *enumerator, int bind, + mca_base_var_flag_t flags, + mca_base_var_info_lvl_t info_level, + mca_base_var_scope_t scope, void *storage); + + /** * Register a synonym name for an MCA variable. *