1.1 --- a/Hardware/CPU/IntelCPU.cs Wed Feb 03 18:10:11 2010 +0000
1.2 +++ b/Hardware/CPU/IntelCPU.cs Wed Feb 03 20:35:10 2010 +0000
1.3 @@ -38,6 +38,7 @@
1.4 using System;
1.5 using System.Collections.Generic;
1.6 using System.Drawing;
1.7 +using System.Diagnostics;
1.8 using System.Reflection;
1.9 using System.Text;
1.10
1.11 @@ -48,12 +49,19 @@
1.12 private Image icon;
1.13
1.14 private Sensor[] coreTemperatures;
1.15 + private Sensor totalLoad;
1.16 + private Sensor[] coreLoads;
1.17 +
1.18 + private List<ISensor> active = new List<ISensor>();
1.19
1.20 private float tjMax = 0;
1.21 private uint logicalProcessors;
1.22 private uint logicalProcessorsPerCore;
1.23 private uint coreCount;
1.24
1.25 + private PerformanceCounter totalLoadCounter;
1.26 + private PerformanceCounter[] coreLoadCounters;
1.27 +
1.28 private const uint IA32_THERM_STATUS_MSR = 0x019C;
1.29 private const uint IA32_TEMPERATURE_TARGET = 0x01A2;
1.30
1.31 @@ -125,11 +133,29 @@
1.32 default: tjMax = 100; break;
1.33 }
1.34
1.35 + totalLoadCounter = new PerformanceCounter();
1.36 + totalLoadCounter.CategoryName = "Processor";
1.37 + totalLoadCounter.CounterName = "% Processor Time";
1.38 + totalLoadCounter.InstanceName = "_Total";
1.39 + totalLoad = new Sensor("CPU Total", 0, SensorType.Load, this);
1.40 +
1.41 + coreLoadCounters = new PerformanceCounter[
1.42 + coreCount * logicalProcessorsPerCore];
1.43 + for (int i = 0; i < coreLoadCounters.Length; i++) {
1.44 + coreLoadCounters[i] = new PerformanceCounter();
1.45 + coreLoadCounters[i].CategoryName = "Processor";
1.46 + coreLoadCounters[i].CounterName = "% Processor Time";
1.47 + coreLoadCounters[i].InstanceName = i.ToString();
1.48 + }
1.49 +
1.50 coreTemperatures = new Sensor[coreCount];
1.51 - for (int i = 0; i < coreTemperatures.Length; i++)
1.52 - coreTemperatures[i] =
1.53 - new Sensor("Core #" + (i + 1), i, tjMax, SensorType.Temperature,
1.54 - this);
1.55 + coreLoads = new Sensor[coreCount];
1.56 + for (int i = 0; i < coreTemperatures.Length; i++) {
1.57 + coreTemperatures[i] = new Sensor("Core #" + (i + 1), i, tjMax,
1.58 + SensorType.Temperature, this);
1.59 + coreLoads[i] = new Sensor("Core #" + (i + 1), i + 1,
1.60 + SensorType.Load, this);
1.61 + }
1.62
1.63 Update();
1.64 }
1.65 @@ -147,9 +173,7 @@
1.66 }
1.67
1.68 public ISensor[] Sensors {
1.69 - get {
1.70 - return coreTemperatures;
1.71 - }
1.72 + get { return active.ToArray(); }
1.73 }
1.74
1.75 public string GetReport() {
1.76 @@ -180,14 +204,44 @@
1.77 if ((eax & 0x80000000) != 0) {
1.78 // get the dist from tjMax from bits 22:16
1.79 coreTemperatures[i].Value = tjMax - ((eax & 0x007F0000) >> 16);
1.80 + ActivateSensor(coreTemperatures[i]);
1.81 + } else {
1.82 + DeactivateSensor(coreTemperatures[i]);
1.83 }
1.84 }
1.85 - }
1.86 + }
1.87 +
1.88 + totalLoad.Value = totalLoadCounter.NextValue();
1.89 + ActivateSensor(totalLoad);
1.90 +
1.91 + for (int i = 0; i < coreLoads.Length; i++) {
1.92 + float value = 0;
1.93 + for (int j = 0; j < logicalProcessorsPerCore; j++)
1.94 + value += coreLoadCounters[
1.95 + logicalProcessorsPerCore * i + j].NextValue();
1.96 + value /= logicalProcessorsPerCore;
1.97 + coreLoads[i].Value = value;
1.98 + ActivateSensor(coreLoads[i]);
1.99 + }
1.100 }
1.101
1.102 - #pragma warning disable 67
1.103 + private void ActivateSensor(Sensor sensor) {
1.104 + if (!active.Contains(sensor)) {
1.105 + active.Add(sensor);
1.106 + if (SensorAdded != null)
1.107 + SensorAdded(sensor);
1.108 + }
1.109 + }
1.110 +
1.111 + private void DeactivateSensor(Sensor sensor) {
1.112 + if (active.Contains(sensor)) {
1.113 + active.Remove(sensor);
1.114 + if (SensorRemoved != null)
1.115 + SensorRemoved(sensor);
1.116 + }
1.117 + }
1.118 +
1.119 public event SensorEventHandler SensorAdded;
1.120 public event SensorEventHandler SensorRemoved;
1.121 - #pragma warning restore 67
1.122 }
1.123 }