| /** |
| * Copyright (c) 2020, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "Experiments.h" |
| |
| #include <android-base/format.h> |
| #include <netdutils/DumpWriter.h> |
| #include <string> |
| |
| #include "util.h" |
| |
| namespace android::net { |
| |
| using netdutils::DumpWriter; |
| using netdutils::ScopedIndent; |
| |
| Experiments* Experiments::getInstance() { |
| // Instantiated on first use. |
| static Experiments instance{getExperimentFlagInt}; |
| return &instance; |
| } |
| |
| Experiments::Experiments(GetExperimentFlagIntFunction getExperimentFlagIntFunction) |
| : mGetExperimentFlagIntFunction(std::move(getExperimentFlagIntFunction)) { |
| updateInternal(); |
| } |
| |
| void Experiments::update() { |
| updateInternal(); |
| } |
| |
| void Experiments::dump(DumpWriter& dw) const { |
| std::lock_guard guard(mMutex); |
| dw.println("Experiments list: "); |
| for (const auto& [key, value] : mFlagsMapInt) { |
| ScopedIndent indentStats(dw); |
| if (value == Experiments::kFlagIntDefault) { |
| dw.println(fmt::format("{}: UNSET", key)); |
| } else { |
| dw.println(fmt::format("{}: {}", key, value)); |
| } |
| } |
| } |
| |
| void Experiments::updateInternal() { |
| std::lock_guard guard(mMutex); |
| for (const auto& key : kExperimentFlagKeyList) { |
| mFlagsMapInt[key] = mGetExperimentFlagIntFunction(key, Experiments::kFlagIntDefault); |
| } |
| } |
| |
| int Experiments::getFlag(std::string_view key, int defaultValue) const { |
| std::lock_guard guard(mMutex); |
| auto it = mFlagsMapInt.find(key); |
| if (it != mFlagsMapInt.end() && it->second != Experiments::kFlagIntDefault) { |
| return it->second; |
| } |
| return defaultValue; |
| } |
| |
| } // namespace android::net |