Skip to content

Commit

Permalink
#1636 add API for temporarily enabling/disabling debug prints
Browse files Browse the repository at this point in the history
  • Loading branch information
Jakub Strzebonski committed Jan 14, 2022
1 parent 176190c commit db22225
Show file tree
Hide file tree
Showing 3 changed files with 191 additions and 2 deletions.
67 changes: 67 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,73 @@

#define vt_option_check_enabled(mode, bit) ((mode & bit) not_eq 0)

#define vt_debug_temp_enable_opt(opt) \
::vt::debug::preConfigRef()->vt_debug_##opt = true

#define vt_debug_temp_disable_opt(opt) \
::vt::debug::preConfigRef()->vt_debug_##opt = false

#define vt_debug_scoped_enable_opt(opt) \
ScopedModifier_##opt##_##true { }

#define vt_debug_scoped_disable_opt(opt) \
ScopedModifier_##opt##_##false { }

#define vt_scoped_modifier_opt(opt, val) \
struct ScopedModifier_##opt##_##val { \
ScopedModifier_##opt##_##val() \
: origVal{::vt::debug::preConfig()->vt_debug_##opt} { \
::vt::debug::preConfigRef()->vt_debug_##opt = val; \
} \
\
~ScopedModifier_##opt##_##val() { \
::vt::debug::preConfigRef()->vt_debug_##opt = origVal; \
} \
\
private: \
bool origVal; \
}

#define vt_define_debug_scoped_modifiers(opt) \
vt_scoped_modifier_opt(opt, true); \
vt_scoped_modifier_opt(opt, false)

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);

namespace vt { namespace runtime {
struct Runtime;
}} /* end namespace vt::runtime */
Expand Down
12 changes: 10 additions & 2 deletions src/vt/runtime/runtime_get.cc
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,16 @@ static arguments::AppConfig preInitAppConfig{};
*
* \return A modifiable configuration
*/
arguments::AppConfig* preConfigRef(){
return &preInitAppConfig;
arguments::AppConfig* preConfigRef() {
if (not curRT)
return &preInitAppConfig;

auto* config = curRT->theArgConfig;
if (not config) {
return &preInitAppConfig;
}

return &config->config_;
}

/**
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 [email protected]
//
// *****************************************************************************
//@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 db22225

Please sign in to comment.