/* * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package jdk.internal.platform.cgroupv1; import jdk.internal.platform.CgroupSubsystem; import jdk.internal.platform.CgroupSubsystemController; public class CgroupV1SubsystemController implements CgroupSubsystemController { private static final double DOUBLE_RETVAL_UNLIMITED = CgroupSubsystem.LONG_RETVAL_UNLIMITED; // Values returned larger than this number are unlimited. static long UNLIMITED_MIN = 0x7FFFFFFFFF000000L; String root; String mountPoint; String path; public CgroupV1SubsystemController(String root, String mountPoint) { this.root = root; this.mountPoint = mountPoint; } public void setPath(String cgroupPath) { if (root != null && cgroupPath != null) { if (root.equals("/")) { if (!cgroupPath.equals("/")) { path = mountPoint + cgroupPath; } else { path = mountPoint; } } else { if (root.equals(cgroupPath)) { path = mountPoint; } else { if (cgroupPath.startsWith(root)) { if (cgroupPath.length() > root.length()) { String cgroupSubstr = cgroupPath.substring(root.length()); path = mountPoint + cgroupSubstr; } } } } } } @Override public String path() { return path; } public static long getLongEntry(CgroupSubsystemController controller, String param, String entryname) { return CgroupSubsystemController.getLongEntry(controller, param, entryname, CgroupSubsystem.LONG_RETVAL_UNLIMITED /* retval on error */); } public static double getDoubleValue(CgroupSubsystemController controller, String parm) { return CgroupSubsystemController.getDoubleValue(controller, parm, DOUBLE_RETVAL_UNLIMITED /* retval on error */); } public static long convertStringToLong(String strval) { return CgroupSubsystemController.convertStringToLong(strval, Long.MAX_VALUE /* overflow value */, CgroupSubsystem.LONG_RETVAL_UNLIMITED /* retval on error */); } public static long longValOrUnlimited(long value) { return value > UNLIMITED_MIN ? CgroupSubsystem.LONG_RETVAL_UNLIMITED : value; } public static long getLongValueMatchingLine(CgroupSubsystemController controller, String param, String match) { return CgroupSubsystemController.getLongValueMatchingLine(controller, param, match, CgroupV1SubsystemController::convertHierachicalLimitLine, CgroupSubsystem.LONG_RETVAL_UNLIMITED); } public static long convertHierachicalLimitLine(String line) { String[] tokens = line.split("\\s"); if (tokens.length == 2) { String strVal = tokens[1]; return CgroupV1SubsystemController.convertStringToLong(strVal); } return CgroupV1SubsystemController.UNLIMITED_MIN + 1; // unlimited } }