| // (c) Facebook, Inc. and its affiliates. Confidential and proprietary. |
| |
| // This is a very basic knob implementation that purely uses command line flags. |
| // This can be replaced with a more sophisticated implementation for use in |
| // other production environments. |
| |
| #include <map> |
| |
| #include <c10/util/string_view.h> |
| #include <c10/util/Flags.h> |
| |
| #include "caffe2/utils/knobs.h" |
| |
| namespace caffe2 { |
| |
| namespace detail { |
| // Get the map of knob names to pointers to their command-line controlled |
| // boolean value. |
| std::map<c10::string_view, bool*>& getRegisteredKnobs() { |
| // It's safe to store the keys as string_view, since DEFINE_KNOB() ensures |
| // that these views always point to string literals. |
| static std::map<c10::string_view, bool*> registeredKnobs; |
| return registeredKnobs; |
| } |
| } // namespace detail |
| |
| bool CheckKnob(c10::string_view name) { |
| const auto& knobs = detail::getRegisteredKnobs(); |
| auto iter = knobs.find(name); |
| if (iter == knobs.end()) { |
| throw std::invalid_argument( |
| "attempted to check unknown knob \"" + std::string(name) + "\""); |
| } |
| return *iter->second; |
| } |
| |
| namespace { |
| class RegisterKnob { |
| public: |
| RegisterKnob(c10::string_view name, bool* cmdlineFlag) { |
| auto ret = caffe2::detail::getRegisteredKnobs().emplace(name, cmdlineFlag); |
| if (!ret.second) { |
| throw std::runtime_error("duplicate knob name: " + std::string(name)); |
| } |
| } |
| }; |
| } // namespace |
| } // namespace caffe2 |
| |
| /** |
| * Define a knob. |
| * |
| * This will define a --caffe2_knob_<name> command line flag to control the |
| * knob. |
| * |
| * The knob can be checked in code by calling CheckKnob(name) |
| * or CheckKnob<check_fn_name>() |
| */ |
| #define DEFINE_KNOB(name, check_fn_name, default_value, docstring) \ |
| C10_DEFINE_bool(caffe2_knob_##name, default_value, docstring); \ |
| namespace caffe2 { \ |
| bool CheckKnob##check_fn_name() { \ |
| return FLAGS_caffe2_knob_##name; \ |
| } \ |
| } \ |
| static caffe2::RegisterKnob _knob_##name(#name, &FLAGS_caffe2_knob_##name) |
| |
| /* |
| * Definitions of well-known knobs. |
| */ |
| |
| DEFINE_KNOB( |
| example_knob, |
| ExampleKnob, |
| false, |
| "An example knob, mainly intended for use in unit tests"); |