diff --git a/.clang-format b/.clang-format index 5e636a0797..6d9adac5a3 100644 --- a/.clang-format +++ b/.clang-format @@ -60,7 +60,7 @@ FixNamespaceComments: true IncludeBlocks: Preserve IndentCaseLabels: false IndentGotoLabels: false -IndentPPDirectives: BeforeHash +IndentPPDirectives: PPDIS_None IndentWidth: 2 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: false diff --git a/src/vt/configs/debug/debug_print.cc b/src/vt/configs/debug/debug_print.cc new file mode 100644 index 0000000000..0e2df5f60d --- /dev/null +++ b/src/vt/configs/debug/debug_print.cc @@ -0,0 +1,108 @@ +/* +//@HEADER +// ***************************************************************************** +// +// debug_print.cc +// DARMA/vt => Virtual Transport +// +// Copyright 2019-2021 National Technology & Engineering Solutions of Sandia, LLC +// (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. +// Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact darma@sandia.gov +// +// ***************************************************************************** +//@HEADER +*/ + +#include "vt/configs/debug/debug_masterconfig.h" +#include "vt/configs/debug/debug_print.h" +#include "vt/configs/error/hard_error.h" + +#define vt_scoped_modifier_opt_definition(opt, val) \ + ScopedModifier_##opt##_##val::ScopedModifier_##opt##_##val() \ + : orig_val{::vt::theConfig()->vt_debug_##opt} { \ + ::vt::theConfig()->vt_debug_##opt = val; \ + } \ + \ + ScopedModifier_##opt##_##val::~ScopedModifier_##opt##_##val() { \ + ::vt::theConfig()->vt_debug_##opt = orig_val; \ + } \ + \ + ScopedModifier_##opt##_##val createScopedModifier_##opt##_##val() { \ + if (not ::vt::curRT) { \ + vtAbort("Trying to read config when VT is not initialized"); \ + } \ + \ + return ScopedModifier_##opt##_##val{}; \ + } + +#define vt_define_debug_scoped_modifiers(opt) \ + vt_scoped_modifier_opt_definition(opt, true) \ + vt_scoped_modifier_opt_definition(opt, false) + +namespace vt { + +vt_define_debug_scoped_modifiers(all) +vt_define_debug_scoped_modifiers(none) +vt_define_debug_scoped_modifiers(gen) +vt_define_debug_scoped_modifiers(runtime) +vt_define_debug_scoped_modifiers(active) +vt_define_debug_scoped_modifiers(term) +vt_define_debug_scoped_modifiers(termds) +vt_define_debug_scoped_modifiers(barrier) +vt_define_debug_scoped_modifiers(event) +vt_define_debug_scoped_modifiers(pipe) +vt_define_debug_scoped_modifiers(pool) +vt_define_debug_scoped_modifiers(reduce) +vt_define_debug_scoped_modifiers(rdma) +vt_define_debug_scoped_modifiers(rdma_channel) +vt_define_debug_scoped_modifiers(rdma_state) +vt_define_debug_scoped_modifiers(param) +vt_define_debug_scoped_modifiers(handler) +vt_define_debug_scoped_modifiers(hierlb) +vt_define_debug_scoped_modifiers(temperedlb) +vt_define_debug_scoped_modifiers(scatter) +vt_define_debug_scoped_modifiers(sequence) +vt_define_debug_scoped_modifiers(sequence_vrt) +vt_define_debug_scoped_modifiers(serial_msg) +vt_define_debug_scoped_modifiers(trace) +vt_define_debug_scoped_modifiers(location) +vt_define_debug_scoped_modifiers(lb) +vt_define_debug_scoped_modifiers(vrt) +vt_define_debug_scoped_modifiers(vrt_coll) +vt_define_debug_scoped_modifiers(worker) +vt_define_debug_scoped_modifiers(group) +vt_define_debug_scoped_modifiers(broadcast) +vt_define_debug_scoped_modifiers(objgroup) +vt_define_debug_scoped_modifiers(phase) +vt_define_debug_scoped_modifiers(context) +vt_define_debug_scoped_modifiers(epoch) + +} diff --git a/src/vt/configs/debug/debug_print.h b/src/vt/configs/debug/debug_print.h index f252dd9d8a..2310efaf3a 100644 --- a/src/vt/configs/debug/debug_print.h +++ b/src/vt/configs/debug/debug_print.h @@ -159,6 +159,111 @@ #define vt_option_check_enabled(mode, bit) ((mode & bit) not_eq 0) +/** + * \brief Temporarily enable debug print option. + * vt needs to be initialized before usage. + */ +#define vt_debug_temp_enable_opt(opt) \ + if (not ::vt::curRT) { \ + vtAbort("Trying to read config when VT is not initialized"); \ + } \ + \ + ::vt::theConfig()->vt_debug_##opt = true + +/** + * \brief Temporarily disable debug print option. + * vt needs to be initialized before usage. + */ +#define vt_debug_temp_disable_opt(opt) \ + if (not ::vt::curRT) { \ + vtAbort("Trying to read config when VT is not initialized"); \ + } \ + \ + ::vt::theConfig()->vt_debug_##opt = false + +/** + * \brief Temporarily enable debug print option in given scope. When exiting + * a scope, it restores original option value. + * vt needs to be initialized before usage. + * + * Usage: + * { + * ... + * auto const scopedEnabledContext = vt_debug_scoped_enable_opt(context); + * ... + * } + */ +#define vt_debug_scoped_enable_opt(opt) createScopedModifier_##opt##_true() + +/** + * \brief Temporarily disable debug print option in given scope. When exiting + * a scope, it restores original option value. + * vt needs to be initialized before usage. + * + * Usage: + * { + * ... + * auto const scopedDisabledContext = vt_debug_scoped_disable_opt(context); + * ... + * } + */ +#define vt_debug_scoped_disable_opt(opt) createScopedModifier_##opt##_##false() + +#define vt_scoped_modifier_opt_declaration(opt, val) \ + struct ScopedModifier_##opt##_##val { \ + ScopedModifier_##opt##_##val(); \ + ~ScopedModifier_##opt##_##val(); \ + \ + private: \ + bool orig_val; \ + }; \ + \ + ScopedModifier_##opt##_##val createScopedModifier_##opt##_##val() + +#define vt_declare_debug_scoped_modifiers(opt) \ + vt_scoped_modifier_opt_declaration(opt, true); \ + vt_scoped_modifier_opt_declaration(opt, false) + +namespace vt { + +vt_declare_debug_scoped_modifiers(all); +vt_declare_debug_scoped_modifiers(none); +vt_declare_debug_scoped_modifiers(gen); +vt_declare_debug_scoped_modifiers(runtime); +vt_declare_debug_scoped_modifiers(active); +vt_declare_debug_scoped_modifiers(term); +vt_declare_debug_scoped_modifiers(termds); +vt_declare_debug_scoped_modifiers(barrier); +vt_declare_debug_scoped_modifiers(event); +vt_declare_debug_scoped_modifiers(pipe); +vt_declare_debug_scoped_modifiers(pool); +vt_declare_debug_scoped_modifiers(reduce); +vt_declare_debug_scoped_modifiers(rdma); +vt_declare_debug_scoped_modifiers(rdma_channel); +vt_declare_debug_scoped_modifiers(rdma_state); +vt_declare_debug_scoped_modifiers(param); +vt_declare_debug_scoped_modifiers(handler); +vt_declare_debug_scoped_modifiers(hierlb); +vt_declare_debug_scoped_modifiers(temperedlb); +vt_declare_debug_scoped_modifiers(scatter); +vt_declare_debug_scoped_modifiers(sequence); +vt_declare_debug_scoped_modifiers(sequence_vrt); +vt_declare_debug_scoped_modifiers(serial_msg); +vt_declare_debug_scoped_modifiers(trace); +vt_declare_debug_scoped_modifiers(location); +vt_declare_debug_scoped_modifiers(lb); +vt_declare_debug_scoped_modifiers(vrt); +vt_declare_debug_scoped_modifiers(vrt_coll); +vt_declare_debug_scoped_modifiers(worker); +vt_declare_debug_scoped_modifiers(group); +vt_declare_debug_scoped_modifiers(broadcast); +vt_declare_debug_scoped_modifiers(objgroup); +vt_declare_debug_scoped_modifiers(phase); +vt_declare_debug_scoped_modifiers(context); +vt_declare_debug_scoped_modifiers(epoch); + +} // namespace vt + namespace vt { namespace runtime { struct Runtime; }} /* end namespace vt::runtime */ diff --git a/src/vt/runtime/runtime_get.cc b/src/vt/runtime/runtime_get.cc index 2a3d86a574..e7260d5882 100644 --- a/src/vt/runtime/runtime_get.cc +++ b/src/vt/runtime/runtime_get.cc @@ -168,7 +168,7 @@ static arguments::AppConfig preInitAppConfig{}; * * \return A modifiable configuration */ -arguments::AppConfig* preConfigRef(){ +arguments::AppConfig* preConfigRef() { return &preInitAppConfig; } diff --git a/tests/unit/runtime/test_temp_enabling_debug_prints.nompi.cc b/tests/unit/runtime/test_temp_enabling_debug_prints.nompi.cc new file mode 100644 index 0000000000..50352f32cf --- /dev/null +++ b/tests/unit/runtime/test_temp_enabling_debug_prints.nompi.cc @@ -0,0 +1,114 @@ +/* +//@HEADER +// ***************************************************************************** +// +// test_temp_enabling_debug_prints.nompi.cc +// DARMA/vt => Virtual Transport +// +// Copyright 2019-2021 National Technology & Engineering Solutions of Sandia, LLC +// (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. +// Government retains certain rights in this software. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact darma@sandia.gov +// +// ***************************************************************************** +//@HEADER +*/ + +#include + +#include "test_harness.h" + +#include +#include + +namespace vt { namespace tests { namespace unit { + +struct TestTempEnablingDisablingDebugPrints : TestHarness { }; + +TEST_F(TestTempEnablingDisablingDebugPrints, test_manual_enabling_disabling) { + vt::initialize(); + + EXPECT_EQ(theConfig()->vt_debug_all, false); + EXPECT_EQ(theConfig()->vt_debug_termds, false); + EXPECT_EQ(theConfig()->vt_debug_param, false); + EXPECT_EQ(theConfig()->vt_debug_scatter, false); + + vt_debug_temp_enable_opt(all); + vt_debug_temp_enable_opt(termds); + vt_debug_temp_enable_opt(param); + vt_debug_temp_enable_opt(scatter); + + EXPECT_EQ(theConfig()->vt_debug_all, true); + EXPECT_EQ(theConfig()->vt_debug_termds, true); + EXPECT_EQ(theConfig()->vt_debug_param, true); + EXPECT_EQ(theConfig()->vt_debug_scatter, true); + + vt_debug_temp_disable_opt(all); + vt_debug_temp_disable_opt(termds); + vt_debug_temp_disable_opt(param); + vt_debug_temp_disable_opt(scatter); + + EXPECT_EQ(theConfig()->vt_debug_all, false); + EXPECT_EQ(theConfig()->vt_debug_termds, false); + EXPECT_EQ(theConfig()->vt_debug_param, false); + EXPECT_EQ(theConfig()->vt_debug_scatter, false); + + vt::finalize(); +} + +TEST_F(TestTempEnablingDisablingDebugPrints, test_scoped_enabling_disabling) { + vt::initialize(); + + EXPECT_EQ(theConfig()->vt_debug_none, false); + EXPECT_EQ(theConfig()->vt_debug_active, false); + EXPECT_EQ(theConfig()->vt_debug_reduce, false); + EXPECT_EQ(theConfig()->vt_debug_context, false); + + { + auto const scopedEnabledNone = vt_debug_scoped_enable_opt(none); + auto const scopedEnabledActive = vt_debug_scoped_enable_opt(active); + auto const scopedEnabledReduce = vt_debug_scoped_enable_opt(reduce); + auto const scopedEnabledContext = vt_debug_scoped_enable_opt(context); + + EXPECT_EQ(theConfig()->vt_debug_none, true); + EXPECT_EQ(theConfig()->vt_debug_active, true); + EXPECT_EQ(theConfig()->vt_debug_reduce, true); + EXPECT_EQ(theConfig()->vt_debug_context, true); + } + + EXPECT_EQ(theConfig()->vt_debug_none, false); + EXPECT_EQ(theConfig()->vt_debug_active, false); + EXPECT_EQ(theConfig()->vt_debug_reduce, false); + EXPECT_EQ(theConfig()->vt_debug_context, false); + + vt::finalize(); +} + +}}} // end namespace vt::tests::unit