git-svn-id: http://webrtc.googlecode.com/svn/trunk@6 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/system_wrappers/source/cpu_linux.cc b/system_wrappers/source/cpu_linux.cc
new file mode 100644
index 0000000..a7ec506
--- /dev/null
+++ b/system_wrappers/source/cpu_linux.cc
@@ -0,0 +1,168 @@
+/*
+ *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "cpu_linux.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+namespace webrtc {
+CpuLinux::CpuLinux()
+{
+    m_oldBusyTime = 0;
+    m_oldIdleTime = 0;
+    m_numCores = 0;
+    m_numCores = GetNumCores();
+    m_oldBusyTimeMulti = new long long[m_numCores];
+    m_oldIdleTimeMulti = new long long[m_numCores];
+    m_idleArray = new long long[m_numCores];
+    m_busyArray = new long long[m_numCores];
+    m_resultArray = new WebRtc_UWord32[m_numCores];
+
+    GetData(m_oldBusyTime, m_oldIdleTime, m_busyArray, m_idleArray);
+}
+
+CpuLinux::~CpuLinux()
+{
+    delete [] m_oldBusyTimeMulti;
+    delete [] m_oldIdleTimeMulti;
+    delete [] m_idleArray;
+    delete [] m_busyArray;
+    delete [] m_resultArray;
+}
+
+WebRtc_Word32 CpuLinux::CpuUsage()
+{
+    WebRtc_UWord32 dummy = 0;
+    WebRtc_UWord32* dummyArray = NULL;
+    return CpuUsageMultiCore(dummy, dummyArray);
+}
+
+WebRtc_Word32 CpuLinux::CpuUsageMultiCore(WebRtc_UWord32& numCores,
+                                          WebRtc_UWord32*& coreArray)
+{
+    coreArray = m_resultArray;
+    numCores = m_numCores;
+    long long busy = 0;
+    long long idle = 0;
+    GetData(busy, idle, m_busyArray, m_idleArray);
+
+    long long deltaBusy = busy - m_oldBusyTime;
+    long long deltaIdle = idle - m_oldIdleTime;
+    m_oldBusyTime = busy;
+    m_oldIdleTime = idle;
+
+    int retVal = -1;
+    if (deltaBusy + deltaIdle == 0)
+    {
+        retVal = 0;
+    }
+    else
+    {
+        retVal = (int)(100 * (deltaBusy) / (deltaBusy + deltaIdle));
+    }
+
+    if (coreArray == NULL)
+    {
+      return retVal;
+    }
+
+    for (WebRtc_UWord32 i = 0; i < m_numCores; i++)
+    {
+        deltaBusy = m_busyArray[i] - m_oldBusyTimeMulti[i];
+        deltaIdle = m_idleArray[i] - m_oldIdleTimeMulti[i];
+        m_oldBusyTimeMulti[i] = m_busyArray[i];
+        m_oldIdleTimeMulti[i] = m_idleArray[i];
+        if(deltaBusy + deltaIdle == 0)
+        {
+            coreArray[i] = 0;
+        }
+        else
+        {
+            coreArray[i] = (int)(100 * (deltaBusy) / (deltaBusy+deltaIdle));
+        }
+    }
+    return retVal;
+}
+
+
+int CpuLinux::GetData(long long& busy, long long& idle, long long*& busyArray,
+                      long long*& idleArray)
+{
+    FILE* fp = fopen("/proc/stat", "r");
+    if (!fp)
+    {
+        return -1;
+    }
+
+    char line[100];
+    char* dummy = fgets(line, 100, fp);
+    char firstWord[100];
+    sscanf(line, "%s ", firstWord);
+    if(strncmp(firstWord, "cpu", 3)!=0)
+    {
+        return -1;
+    }
+    char sUser[100];
+    char sNice[100];
+    char sSystem[100];
+    char sIdle[100];
+    sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem, sIdle);
+    long long luser = atoll(sUser);
+    long long lnice = atoll(sNice);
+    long long lsystem = atoll(sSystem);
+    long long lidle = atoll (sIdle);
+
+    busy = luser + lnice + lsystem;
+    idle = lidle;
+    for (WebRtc_UWord32 i = 0; i < m_numCores; i++)
+    {
+        dummy = fgets(line, 100, fp);
+        sscanf(line, "%s %s %s %s %s ", firstWord, sUser, sNice, sSystem,
+               sIdle);
+        luser = atoll(sUser);
+        lnice = atoll(sNice);
+        lsystem = atoll(sSystem);
+        lidle = atoll (sIdle);
+        busyArray[i] = luser + lnice + lsystem;
+        idleArray[i] = lidle;
+    }
+    fclose(fp);
+    return 0;
+}
+
+int CpuLinux::GetNumCores()
+{
+    FILE* fp = fopen("/proc/stat", "r");
+    if (!fp)
+    {
+        return -1;
+    }
+    // Skip first line
+    char line[100];
+    char* dummy = fgets(line, 100, fp);
+    int numCores = -1;
+    char firstWord[100];
+    do
+    {
+        numCores++;
+        if (fgets(line, 100, fp))
+        {
+            sscanf(line, "%s ", firstWord);
+        } else {
+            break;
+        }
+    } while (strncmp(firstWord, "cpu", 3) == 0);
+    fclose(fp);
+    return numCores;
+}
+} // namespace webrtc