blob: a7ec50654785b7e3be7b54a3df900d0d5f390ef4 [file] [log] [blame]
niklase@google.comf0779a22011-05-30 11:39:38 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "cpu_linux.h"
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <string.h>
16#include <unistd.h>
17
18namespace webrtc {
19CpuLinux::CpuLinux()
20{
21 m_oldBusyTime = 0;
22 m_oldIdleTime = 0;
23 m_numCores = 0;
24 m_numCores = GetNumCores();
25 m_oldBusyTimeMulti = new long long[m_numCores];
26 m_oldIdleTimeMulti = new long long[m_numCores];
27 m_idleArray = new long long[m_numCores];
28 m_busyArray = new long long[m_numCores];
29 m_resultArray = new WebRtc_UWord32[m_numCores];
30
31 GetData(m_oldBusyTime, m_oldIdleTime, m_busyArray, m_idleArray);
32}
33
34CpuLinux::~CpuLinux()
35{
36 delete [] m_oldBusyTimeMulti;
37 delete [] m_oldIdleTimeMulti;
38 delete [] m_idleArray;
39 delete [] m_busyArray;
40 delete [] m_resultArray;
41}
42
43WebRtc_Word32 CpuLinux::CpuUsage()
44{
45 WebRtc_UWord32 dummy = 0;
46 WebRtc_UWord32* dummyArray = NULL;
47 return CpuUsageMultiCore(dummy, dummyArray);
48}
49
50WebRtc_Word32 CpuLinux::CpuUsageMultiCore(WebRtc_UWord32& numCores,
51 WebRtc_UWord32*& coreArray)
52{
53 coreArray = m_resultArray;
54 numCores = m_numCores;
55 long long busy = 0;
56 long long idle = 0;
57 GetData(busy, idle, m_busyArray, m_idleArray);
58
59 long long deltaBusy = busy - m_oldBusyTime;
60 long long deltaIdle = idle - m_oldIdleTime;
61 m_oldBusyTime = busy;
62 m_oldIdleTime = idle;
63
64 int retVal = -1;
65 if (deltaBusy + deltaIdle == 0)
66 {
67 retVal = 0;
68 }
69 else
70 {
71 retVal = (int)(100 * (deltaBusy) / (deltaBusy + deltaIdle));
72 }
73
74 if (coreArray == NULL)
75 {
76 return retVal;
77 }
78
79 for (WebRtc_UWord32 i = 0; i < m_numCores; i++)
80 {
81 deltaBusy = m_busyArray[i] - m_oldBusyTimeMulti[i];
82 deltaIdle = m_idleArray[i] - m_oldIdleTimeMulti[i];
83 m_oldBusyTimeMulti[i] = m_busyArray[i];
84 m_oldIdleTimeMulti[i] = m_idleArray[i];
85 if(deltaBusy + deltaIdle == 0)
86 {
87 coreArray[i] = 0;
88 }
89 else
90 {
91 coreArray[i] = (int)(100 * (deltaBusy) / (deltaBusy+deltaIdle));
92 }
93 }
94 return retVal;
95}
96
97
98int CpuLinux::GetData(long long& busy, long long& idle, long long*& busyArray,
99 long long*& idleArray)
100{
101 FILE* fp = fopen("/proc/stat", "r");
102 if (!fp)
103 {
104 return -1;
105 }
106
107 char line[100];
108 char* dummy = fgets(line, 100, fp);
109 char firstWord[100];
110 sscanf(line, "%s ", firstWord);
111 if(strncmp(firstWord, "cpu", 3)!=0)
112 {
113 return -1;
114 }
115 char sUser[100];
116 char sNice[100];
117 char sSystem[100];
118 char sIdle[100];
119 sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem, sIdle);
120 long long luser = atoll(sUser);
121 long long lnice = atoll(sNice);
122 long long lsystem = atoll(sSystem);
123 long long lidle = atoll (sIdle);
124
125 busy = luser + lnice + lsystem;
126 idle = lidle;
127 for (WebRtc_UWord32 i = 0; i < m_numCores; i++)
128 {
129 dummy = fgets(line, 100, fp);
130 sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem,
131 sIdle);
132 luser = atoll(sUser);
133 lnice = atoll(sNice);
134 lsystem = atoll(sSystem);
135 lidle = atoll (sIdle);
136 busyArray[i] = luser + lnice + lsystem;
137 idleArray[i] = lidle;
138 }
139 fclose(fp);
140 return 0;
141}
142
143int CpuLinux::GetNumCores()
144{
145 FILE* fp = fopen("/proc/stat", "r");
146 if (!fp)
147 {
148 return -1;
149 }
150 // Skip first line
151 char line[100];
152 char* dummy = fgets(line, 100, fp);
153 int numCores = -1;
154 char firstWord[100];
155 do
156 {
157 numCores++;
158 if (fgets(line, 100, fp))
159 {
160 sscanf(line, "%s ", firstWord);
161 } else {
162 break;
163 }
164 } while (strncmp(firstWord, "cpu", 3) == 0);
165 fclose(fp);
166 return numCores;
167}
168} // namespace webrtc