Added CPU handling for Apple Silicon
This commit is contained in:
parent
bb86b1b555
commit
90a2e481f2
2 changed files with 194 additions and 1 deletions
|
|
@ -17,6 +17,7 @@ import net.coreprotect.patch.Patch;
|
||||||
import net.coreprotect.thread.NetworkHandler;
|
import net.coreprotect.thread.NetworkHandler;
|
||||||
import net.coreprotect.utility.Chat;
|
import net.coreprotect.utility.Chat;
|
||||||
import net.coreprotect.utility.Color;
|
import net.coreprotect.utility.Color;
|
||||||
|
import net.coreprotect.utility.SystemUtils;
|
||||||
import net.coreprotect.utility.VersionUtils;
|
import net.coreprotect.utility.VersionUtils;
|
||||||
|
|
||||||
public class StatusCommand {
|
public class StatusCommand {
|
||||||
|
|
@ -116,7 +117,17 @@ public class StatusCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq());
|
String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq());
|
||||||
cpuSpeed = String.format("%.2f", Long.valueOf(cpuSpeed) / 1000000000.0);
|
double speedVal = Long.valueOf(cpuSpeed) / 1000000000.0;
|
||||||
|
|
||||||
|
// Fix for Apple Silicon processors reporting 0 GHz
|
||||||
|
if (speedVal < 0.01 && SystemUtils.isAppleSilicon()) {
|
||||||
|
Double appleSiliconSpeed = SystemUtils.getAppleSiliconSpeed();
|
||||||
|
if (appleSiliconSpeed != null) {
|
||||||
|
speedVal = appleSiliconSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cpuSpeed = String.format("%.2f", speedVal);
|
||||||
cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + cpuSpeed + "GHz " + modelName + ".";
|
cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + cpuSpeed + "GHz " + modelName + ".";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
package net.coreprotect.utility;
|
package net.coreprotect.utility;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.apache.logging.log4j.Level;
|
import org.apache.logging.log4j.Level;
|
||||||
import org.apache.logging.log4j.core.config.Configurator;
|
import org.apache.logging.log4j.core.config.Configurator;
|
||||||
|
|
||||||
|
|
@ -11,6 +17,7 @@ public class SystemUtils {
|
||||||
private static boolean testMode = Boolean.getBoolean("net.coreprotect.test");
|
private static boolean testMode = Boolean.getBoolean("net.coreprotect.test");
|
||||||
private static String processorInfo = null;
|
private static String processorInfo = null;
|
||||||
private static boolean log4jInitialized = false;
|
private static boolean log4jInitialized = false;
|
||||||
|
private static Double appleProcessorSpeed = null;
|
||||||
|
|
||||||
private SystemUtils() {
|
private SystemUtils() {
|
||||||
throw new IllegalStateException("Utility class");
|
throw new IllegalStateException("Utility class");
|
||||||
|
|
@ -29,6 +36,181 @@ public class SystemUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if running on Apple Silicon
|
||||||
|
*
|
||||||
|
* @return True if running on Apple Silicon
|
||||||
|
*/
|
||||||
|
public static boolean isAppleSilicon() {
|
||||||
|
String osName = System.getProperty("os.name", "").toLowerCase();
|
||||||
|
String osArch = System.getProperty("os.arch", "").toLowerCase();
|
||||||
|
|
||||||
|
return osName.contains("mac") && (osArch.contains("aarch64") || osArch.contains("arm"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get processor clock speed for Apple Silicon
|
||||||
|
*
|
||||||
|
* @return Processor speed in GHz, or null if unavailable
|
||||||
|
*/
|
||||||
|
public static Double getAppleSiliconSpeed() {
|
||||||
|
if (appleProcessorSpeed != null) {
|
||||||
|
return appleProcessorSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (testMode) {
|
||||||
|
return 3.2; // Default test value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to determine the CPU model first to use for frequency lookup
|
||||||
|
String modelName = getProcessorModel();
|
||||||
|
|
||||||
|
// First attempt: Get frequency from machdep.cpu.brand_string if it contains GHz info
|
||||||
|
if (modelName != null && modelName.contains("GHz")) {
|
||||||
|
try {
|
||||||
|
Pattern pattern = Pattern.compile("(\\d+\\.\\d+)GHz");
|
||||||
|
Matcher matcher = pattern.matcher(modelName);
|
||||||
|
if (matcher.find()) {
|
||||||
|
appleProcessorSpeed = Double.parseDouble(matcher.group(1));
|
||||||
|
return appleProcessorSpeed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
// Failed to extract frequency from model name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second attempt: Use sysctl method to detect P-core maximum frequencies
|
||||||
|
try {
|
||||||
|
ProcessBuilder pb = new ProcessBuilder("sysctl", "-n", "machdep.cpu.brand_string");
|
||||||
|
Process process = pb.start();
|
||||||
|
|
||||||
|
if (process.waitFor(500, TimeUnit.MILLISECONDS)) {
|
||||||
|
String appleChipInfo = null;
|
||||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
||||||
|
appleChipInfo = reader.readLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (appleChipInfo != null) {
|
||||||
|
// Extract M-series info
|
||||||
|
if (appleChipInfo.contains("M1")) {
|
||||||
|
return getMSeriesSpeed("M1", appleChipInfo);
|
||||||
|
}
|
||||||
|
else if (appleChipInfo.contains("M2")) {
|
||||||
|
return getMSeriesSpeed("M2", appleChipInfo);
|
||||||
|
}
|
||||||
|
else if (appleChipInfo.contains("M3")) {
|
||||||
|
return getMSeriesSpeed("M3", appleChipInfo);
|
||||||
|
}
|
||||||
|
else if (appleChipInfo.contains("M4")) {
|
||||||
|
return getMSeriesSpeed("M4", appleChipInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
// Failed with sysctl method
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to reasonable defaults based on processor model
|
||||||
|
if (modelName != null) {
|
||||||
|
if (modelName.contains("M1")) {
|
||||||
|
appleProcessorSpeed = 3.2;
|
||||||
|
}
|
||||||
|
else if (modelName.contains("M2")) {
|
||||||
|
appleProcessorSpeed = 3.7;
|
||||||
|
}
|
||||||
|
else if (modelName.contains("M3")) {
|
||||||
|
appleProcessorSpeed = 4.05;
|
||||||
|
}
|
||||||
|
else if (modelName.contains("M4")) {
|
||||||
|
appleProcessorSpeed = 4.5;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appleProcessorSpeed = 3.0; // Generic fallback
|
||||||
|
}
|
||||||
|
return appleProcessorSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 3.2; // Default fallback
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the processor speed based on the M-series chip variant
|
||||||
|
*
|
||||||
|
* @param series
|
||||||
|
* The M-series (M1, M2, M3, M4)
|
||||||
|
* @param chipInfo
|
||||||
|
* The full chip info string
|
||||||
|
* @return The processor speed in GHz
|
||||||
|
*/
|
||||||
|
private static Double getMSeriesSpeed(String series, String chipInfo) {
|
||||||
|
switch (series) {
|
||||||
|
case "M1":
|
||||||
|
if (chipInfo.contains("Pro") || chipInfo.contains("Max") || chipInfo.contains("Ultra")) {
|
||||||
|
appleProcessorSpeed = 3.23; // M1 Pro/Max/Ultra P cores
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appleProcessorSpeed = 3.2; // Base M1 P cores
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "M2":
|
||||||
|
if (chipInfo.contains("Pro") || chipInfo.contains("Max") || chipInfo.contains("Ultra")) {
|
||||||
|
appleProcessorSpeed = 3.7; // M2 Pro/Max/Ultra P cores
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appleProcessorSpeed = 3.5; // Base M2 P cores
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "M3":
|
||||||
|
if (chipInfo.contains("Pro") || chipInfo.contains("Max")) {
|
||||||
|
appleProcessorSpeed = 4.05; // M3 Pro/Max P cores
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appleProcessorSpeed = 4.0; // Base M3 P cores
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "M4":
|
||||||
|
if (chipInfo.contains("Max")) {
|
||||||
|
appleProcessorSpeed = 4.5; // M4 Max P cores
|
||||||
|
}
|
||||||
|
else if (chipInfo.contains("Pro")) {
|
||||||
|
appleProcessorSpeed = 4.5; // M4 Pro P cores
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
appleProcessorSpeed = 4.3; // Base M4 P cores
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appleProcessorSpeed = 3.2; // Default
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return appleProcessorSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get processor model name for Apple Silicon
|
||||||
|
*
|
||||||
|
* @return Processor model name, or null if unavailable
|
||||||
|
*/
|
||||||
|
private static String getProcessorModel() {
|
||||||
|
try {
|
||||||
|
ProcessBuilder pb = new ProcessBuilder("sysctl", "-n", "machdep.cpu.brand_string");
|
||||||
|
Process process = pb.start();
|
||||||
|
|
||||||
|
if (process.waitFor(500, TimeUnit.MILLISECONDS)) {
|
||||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
||||||
|
return reader.readLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
// Failed to get CPU model
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static CentralProcessor getProcessorInfo() {
|
public static CentralProcessor getProcessorInfo() {
|
||||||
// In test mode, don't actually try to initialize hardware components
|
// In test mode, don't actually try to initialize hardware components
|
||||||
if (testMode || isLog4jDisabled()) {
|
if (testMode || isLog4jDisabled()) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue