Skip to content

Commit

Permalink
Merge pull request #1658 from DARMA-tasking/1636-api-temporarily-enab…
Browse files Browse the repository at this point in the history
…ling-disabling-debug-prints

#1636 add API for temporarily enabling/disabling debug prints
  • Loading branch information
lifflander authored Feb 1, 2022
2 parents 176190c + c7379fd commit b1e3867
Show file tree
Hide file tree
Showing 5 changed files with 329 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ FixNamespaceComments: true
IncludeBlocks: Preserve
IndentCaseLabels: false
IndentGotoLabels: false
IndentPPDirectives: BeforeHash
IndentPPDirectives: PPDIS_None
IndentWidth: 2
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
Expand Down
108 changes: 108 additions & 0 deletions src/vt/configs/debug/debug_print.cc
Original file line number Diff line number Diff line change
@@ -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)

}
105 changes: 105 additions & 0 deletions src/vt/configs/debug/debug_print.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion src/vt/runtime/runtime_get.cc
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ static arguments::AppConfig preInitAppConfig{};
*
* \return A modifiable configuration
*/
arguments::AppConfig* preConfigRef(){
arguments::AppConfig* preConfigRef() {
return &preInitAppConfig;
}

Expand Down
114 changes: 114 additions & 0 deletions tests/unit/runtime/test_temp_enabling_debug_prints.nompi.cc
Original file line number Diff line number Diff line change
@@ -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 <gtest/gtest.h>

#include "test_harness.h"

#include <vt/collective/startup.h>
#include <vt/configs/arguments/app_config.h>

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

0 comments on commit b1e3867

Please sign in to comment.