| // Copyright 2026 The Bazel Authors. All rights reserved. |
| // |
| // 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. |
| package com.google.devtools.build.lib.profiler; |
| |
| import com.google.devtools.common.options.BooleanStyleOption; |
| import com.google.devtools.common.options.Converter; |
| import com.google.devtools.common.options.Converters; |
| import com.google.devtools.common.options.OptionsParsingException; |
| import java.util.Locale; |
| import java.util.Set; |
| |
| /** Configuration for slim profiling. */ |
| public final class SlimProfileConfiguration { |
| private static final SlimProfileConfiguration DISABLED = new SlimProfileConfiguration(false, -1); |
| private static final SlimProfileConfiguration ALWAYS = new SlimProfileConfiguration(true, -1); |
| |
| private final boolean enabled; |
| private final long sizeLimit; // in bytes. <= 0 means no limit (always slim if enabled) |
| |
| private SlimProfileConfiguration(boolean enabled, long sizeLimit) { |
| this.enabled = enabled; |
| this.sizeLimit = sizeLimit; |
| } |
| |
| public static SlimProfileConfiguration disabled() { |
| return DISABLED; |
| } |
| |
| public static SlimProfileConfiguration always() { |
| return ALWAYS; |
| } |
| |
| public static SlimProfileConfiguration afterSize(long sizeLimit) { |
| return new SlimProfileConfiguration(true, sizeLimit); |
| } |
| |
| public boolean isEnabled() { |
| return enabled; |
| } |
| |
| public long getSizeLimit() { |
| return sizeLimit; |
| } |
| |
| public boolean hasSizeLimit() { |
| return enabled && sizeLimit > 0; |
| } |
| |
| @Override |
| public String toString() { |
| if (!enabled) { |
| return "disabled"; |
| } |
| if (sizeLimit <= 0) { |
| return "enabled (always)"; |
| } |
| return "enabled (after " + sizeLimit + " bytes)"; |
| } |
| |
| /** Converter for {@link SlimProfileConfiguration}. */ |
| public static final class SlimProfileConverter |
| extends Converter.Contextless<SlimProfileConfiguration> implements BooleanStyleOption { |
| private static final Set<String> ENABLED_REPS = Set.of("true", "1", "yes", "t", "y"); |
| private static final Set<String> DISABLED_REPS = Set.of("false", "0", "no", "f", "n"); |
| |
| @Override |
| public SlimProfileConfiguration convert(String input) throws OptionsParsingException { |
| if (input == null) { |
| return SlimProfileConfiguration.disabled(); |
| } |
| String lowerInput = input.toLowerCase(Locale.ENGLISH); |
| if (ENABLED_REPS.contains(lowerInput)) { |
| return SlimProfileConfiguration.always(); |
| } |
| if (DISABLED_REPS.contains(lowerInput)) { |
| return SlimProfileConfiguration.disabled(); |
| } |
| |
| try { |
| long value = new Converters.ByteSizeConverter().convert(input); |
| return SlimProfileConfiguration.afterSize(value); |
| } catch (OptionsParsingException e) { |
| throw new OptionsParsingException( |
| "Expected a boolean or a size in bytes (e.g. 5M), but got: " + input, e); |
| } |
| } |
| |
| @Override |
| public String getTypeDescription() { |
| return "a boolean or a size in bytes (e.g. 5M)"; |
| } |
| } |
| } |