1
2
3
4
5 package oshi.driver.linux.proc;
6
7 import java.util.List;
8
9 import oshi.annotation.concurrent.ThreadSafe;
10 import oshi.hardware.CentralProcessor.TickType;
11 import oshi.util.FileUtil;
12 import oshi.util.ParseUtil;
13 import oshi.util.platform.linux.ProcPath;
14
15
16
17
18 @ThreadSafe
19 public final class CpuStat {
20
21 private CpuStat() {
22 }
23
24
25
26
27
28
29 public static long[] getSystemCpuLoadTicks() {
30 long[] ticks = new long[TickType.values().length];
31
32
33
34 String tickStr;
35 List<String> procStat = FileUtil.readLines(ProcPath.STAT, 1);
36 if (procStat.isEmpty()) {
37 return ticks;
38 }
39 tickStr = procStat.get(0);
40
41
42
43 String[] tickArr = ParseUtil.whitespaces.split(tickStr);
44 if (tickArr.length <= TickType.IDLE.getIndex()) {
45
46 return ticks;
47 }
48
49 for (int i = 0; i < TickType.values().length; i++) {
50 ticks[i] = ParseUtil.parseLongOrDefault(tickArr[i + 1], 0L);
51 }
52
53 return ticks;
54 }
55
56
57
58
59
60
61
62
63 public static long[][] getProcessorCpuLoadTicks(int logicalProcessorCount) {
64 long[][] ticks = new long[logicalProcessorCount][TickType.values().length];
65
66
67
68
69 int cpu = 0;
70 List<String> procStat = FileUtil.readFile(ProcPath.STAT);
71 for (String stat : procStat) {
72 if (stat.startsWith("cpu") && !stat.startsWith("cpu ")) {
73
74
75
76 String[] tickArr = ParseUtil.whitespaces.split(stat);
77 if (tickArr.length <= TickType.IDLE.getIndex()) {
78
79 return ticks;
80 }
81
82 for (int i = 0; i < TickType.values().length; i++) {
83 ticks[cpu][i] = ParseUtil.parseLongOrDefault(tickArr[i + 1], 0L);
84 }
85
86 if (++cpu >= logicalProcessorCount) {
87 break;
88 }
89 }
90 }
91 return ticks;
92 }
93
94
95
96
97
98
99 public static long getContextSwitches() {
100 List<String> procStat = FileUtil.readFile(ProcPath.STAT);
101 for (String stat : procStat) {
102 if (stat.startsWith("ctxt ")) {
103 String[] ctxtArr = ParseUtil.whitespaces.split(stat);
104 if (ctxtArr.length == 2) {
105 return ParseUtil.parseLongOrDefault(ctxtArr[1], 0);
106 }
107 }
108 }
109 return 0L;
110 }
111
112
113
114
115
116
117 public static long getInterrupts() {
118 List<String> procStat = FileUtil.readFile(ProcPath.STAT);
119 for (String stat : procStat) {
120 if (stat.startsWith("intr ")) {
121 String[] intrArr = ParseUtil.whitespaces.split(stat);
122 if (intrArr.length > 2) {
123 return ParseUtil.parseLongOrDefault(intrArr[1], 0);
124 }
125 }
126 }
127 return 0L;
128 }
129
130
131
132
133
134
135 public static long getBootTime() {
136
137 List<String> procStat = FileUtil.readFile(ProcPath.STAT);
138 for (String stat : procStat) {
139 if (stat.startsWith("btime")) {
140 String[] bTime = ParseUtil.whitespaces.split(stat);
141 return ParseUtil.parseLongOrDefault(bTime[1], 0L);
142 }
143 }
144 return 0;
145 }
146 }