/*
* Copyright 2016-present Facebook, Inc.
*
* 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.facebook.buck.util;
import com.facebook.buck.util.immutables.BuckStyleImmutable;
import javax.annotation.Nullable;
import org.immutables.value.Value;
/** Represents resource consumption counters of a {@link Process}. */
@Value.Immutable
@BuckStyleImmutable
abstract class AbstractProcessResourceConsumption {
@Value.Parameter
public abstract long getMemResident();
@Value.Parameter
public abstract long getMemSize();
@Value.Parameter
public abstract long getCpuReal();
@Value.Parameter
public abstract long getCpuUser();
@Value.Parameter
public abstract long getCpuSys();
@Value.Parameter
public abstract long getCpuTotal();
@Value.Parameter
public abstract long getIoBytesRead();
@Value.Parameter
public abstract long getIoBytesWritten();
@Value.Parameter
public abstract long getIoTotal();
@Nullable
public static ProcessResourceConsumption getPeak(
@Nullable ProcessResourceConsumption r1, @Nullable ProcessResourceConsumption r2) {
if (r1 == null) {
return r2;
}
if (r2 == null) {
return r1;
}
return ProcessResourceConsumption.builder()
.setMemResident(Math.max(r1.getMemResident(), r2.getMemResident()))
.setMemSize(Math.max(r1.getMemSize(), r2.getMemSize()))
.setCpuReal(Math.max(r1.getCpuReal(), r2.getCpuReal()))
.setCpuUser(Math.max(r1.getCpuUser(), r2.getCpuUser()))
.setCpuSys(Math.max(r1.getCpuSys(), r2.getCpuSys()))
.setCpuTotal(Math.max(r1.getCpuTotal(), r2.getCpuTotal()))
.setIoBytesRead(Math.max(r1.getIoBytesRead(), r2.getIoBytesRead()))
.setIoBytesWritten(Math.max(r1.getIoBytesWritten(), r2.getIoBytesWritten()))
.setIoTotal(Math.max(r1.getIoTotal(), r2.getIoTotal()))
.build();
}
@Nullable
public static ProcessResourceConsumption getTotal(
@Nullable ProcessResourceConsumption r1, @Nullable ProcessResourceConsumption r2) {
if (r1 == null) {
return r2;
}
if (r2 == null) {
return r1;
}
// For some stats such as cpu_real, parent's consumption already includes child's consumption,
// so we just take max instead of sum to avoid double counting.
return ProcessResourceConsumption.builder()
.setMemResident(r1.getMemResident() + r2.getMemResident())
.setMemSize(r1.getMemSize() + r2.getMemSize())
.setCpuReal(Math.max(r1.getCpuReal(), r2.getCpuReal()))
.setCpuUser(r1.getCpuUser() + r2.getCpuUser())
.setCpuSys(r1.getCpuSys() + r2.getCpuSys())
.setCpuTotal(r1.getCpuTotal() + r2.getCpuTotal())
.setIoBytesRead(r1.getIoBytesRead() + r2.getIoBytesRead())
.setIoBytesWritten(r1.getIoBytesWritten() + r2.getIoBytesWritten())
.setIoTotal(r1.getIoTotal() + r2.getIoTotal())
.build();
}
}