blob: 9f0d640317e042d3b8e1ace9e1acaa0a3d1233fd [file]
// 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)";
}
}
}