[ros-diffs] [hbirr] 14817: - Used SysProcessorTimeInfo to calculate the idle time.

hbirr at svn.reactos.com hbirr at svn.reactos.com
Tue Apr 26 18:28:40 CEST 2005


- Used SysProcessorTimeInfo to calculate the idle time.  
- Fixed the allocation of SysProcessorTimeInfo.  
- Used the process creation time as second unique id.
Modified: trunk/rosapps/sysutils/ctm/ctm.c
Modified: trunk/rosapps/sysutils/ctm/ctm.h
  _____  

Modified: trunk/rosapps/sysutils/ctm/ctm.c
--- trunk/rosapps/sysutils/ctm/ctm.c	2005-04-26 14:51:18 UTC (rev
14816)
+++ trunk/rosapps/sysutils/ctm/ctm.c	2005-04-26 16:28:38 UTC (rev
14817)
@@ -78,7 +78,7 @@

 double			dbKernelTime;
 double			dbSystemTime;
 LARGE_INTEGER		liOldIdleTime = {{0,0}};
-double			OldKernelTime = 0;
+LARGE_INTEGER		liOldKernelTime = {{0,0}};
 LARGE_INTEGER		liOldSystemTime = {{0,0}};
 
 PPERFDATA		pPerfDataOld = NULL;	// Older perf data
(saved to establish delta values)
@@ -357,43 +357,47 @@
 	PPERFDATA						pPDOld;
 	TCHAR
szTemp[MAX_PATH];
 	DWORD							dwSize;
-	double
CurrentKernelTime;
+#ifdef TIMES
+	LARGE_INTEGER
liCurrentKernelTime;
+	LARGE_INTEGER
liCurrentIdleTime;
+	LARGE_INTEGER
liCurrentTime;
+#endif
 	PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
SysProcessorTimeInfo;
-	SYSTEM_PERFORMANCE_INFORMATION	SysPerfInfo;
-	SYSTEM_TIMEOFDAY_INFORMATION            SysTimeInfo;
+	SYSTEM_TIMEOFDAY_INFORMATION
SysTimeInfo;
 
 #ifdef TIMES
 	// Get new system time
 	status = NtQuerySystemInformation(SystemTimeInformation,
&SysTimeInfo, sizeof(SysTimeInfo), 0);
 	if (status != NO_ERROR)
 		return;
-
-	// Get new CPU's idle time
-	status = NtQuerySystemInformation(SystemPerformanceInformation,
&SysPerfInfo, sizeof(SysPerfInfo), NULL);
-	if (status != NO_ERROR)
-		return;
 #endif
 	// Get processor information	
-	SysProcessorTimeInfo =
(PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)malloc(sizeof(PSYSTEM_PROCESS
OR_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberProcessors);
-	status = NtQuerySystemInformation(SystemProcessorTimes,
SysProcessorTimeInfo, sizeof(PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
* SystemBasicInfo.NumberProcessors, &ulSize);
+	SysProcessorTimeInfo =
(PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)malloc(sizeof(SYSTEM_PROCESSO
R_PERFORMANCE_INFORMATION) * SystemBasicInfo.NumberProcessors);
+	status =
NtQuerySystemInformation(SystemProcessorPerformanceInformation,
SysProcessorTimeInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) *
SystemBasicInfo.NumberProcessors, &ulSize);
 
 
 	// Get process information
 	PsaCaptureProcessesAndThreads((PSYSTEM_PROCESS_INFORMATION
*)&pBuffer);
 
 #ifdef TIMES
-	for (CurrentKernelTime=0, Idx=0;
Idx<SystemBasicInfo.NumberProcessors; Idx++) {
-		CurrentKernelTime +=
Li2Double(SysProcessorTimeInfo[Idx].KernelTime);
-		CurrentKernelTime +=
Li2Double(SysProcessorTimeInfo[Idx].DpcTime);
-		CurrentKernelTime +=
Li2Double(SysProcessorTimeInfo[Idx].InterruptTime);
+	liCurrentKernelTime.QuadPart = 0;
+	liCurrentIdleTime.QuadPart = 0;
+	for (Idx=0; Idx<SystemBasicInfo.NumberProcessors; Idx++) {
+		liCurrentKernelTime.QuadPart +=
SysProcessorTimeInfo[Idx].KernelTime.QuadPart;
+		liCurrentKernelTime.QuadPart +=
SysProcessorTimeInfo[Idx].DpcTime.QuadPart;
+		liCurrentKernelTime.QuadPart +=
SysProcessorTimeInfo[Idx].InterruptTime.QuadPart;
+		liCurrentIdleTime.QuadPart +=
SysProcessorTimeInfo[Idx].IdleTime.QuadPart;
 	}
 
 	// If it's a first call - skip idle time calcs
 	if (liOldIdleTime.QuadPart != 0) {
 		// CurrentValue = NewValue - OldValue
-		dbIdleTime = Li2Double(SysPerfInfo.IdleTime) -
Li2Double(liOldIdleTime);
-		dbKernelTime = CurrentKernelTime - OldKernelTime;
-		dbSystemTime = Li2Double(SysTimeInfo.CurrentTime) -
Li2Double(liOldSystemTime);
+		liCurrentTime.QuadPart = liCurrentIdleTime.QuadPart -
liOldIdleTime.QuadPart;
+		dbIdleTime = Li2Double(liCurrentTime);
+		liCurrentTime.QuadPart = liCurrentKernelTime.QuadPart -
liOldKernelTime.QuadPart;
+		dbKernelTime = Li2Double(liCurrentTime);
+		liCurrentTime.QuadPart =
SysTimeInfo.CurrentTime.QuadPart - liOldSystemTime.QuadPart;
+	    	dbSystemTime = Li2Double(liCurrentTime);
 
 		// CurrentCpuIdle = IdleTime / SystemTime
 		dbIdleTime = dbIdleTime / dbSystemTime;
@@ -405,9 +409,9 @@
 	}
 
 	// Store new CPU's idle and system time
-	liOldIdleTime = SysPerfInfo.IdleTime;
+	liOldIdleTime = liCurrentIdleTime;
 	liOldSystemTime = SysTimeInfo.CurrentTime;
-	OldKernelTime = CurrentKernelTime;
+	liOldKernelTime = liCurrentKernelTime;
 #endif
 
 	// Determine the process count
@@ -434,7 +438,9 @@
 		// so that we can establish delta values
 		pPDOld = NULL;
 		for (Idx2=0; Idx2<ProcessCountOld; Idx2++) {
-			if (pPerfDataOld[Idx2].ProcessId ==
pSPI->UniqueProcessId) {
+			if (pPerfDataOld[Idx2].ProcessId ==
(ULONG)(pSPI->UniqueProcessId) &&
+			    /* check also for the creation time, a new
process may have an id of an old one */
+			    pPerfDataOld[Idx2].CreateTime.QuadPart ==
pSPI->CreateTime.QuadPart) {
 				pPDOld = &pPerfDataOld[Idx2];
 				break;
 			}
@@ -456,7 +462,8 @@
 #endif
 		}
 
-		pPerfData[Idx].ProcessId = pSPI->UniqueProcessId;
+		pPerfData[Idx].ProcessId =
(ULONG)(pSPI->UniqueProcessId);
+		pPerfData[Idx].CreateTime = pSPI->CreateTime;
 
 		if (pPDOld)	{
 #ifdef TIMES
  _____  

Modified: trunk/rosapps/sysutils/ctm/ctm.h
--- trunk/rosapps/sysutils/ctm/ctm.h	2005-04-26 14:51:18 UTC (rev
14816)
+++ trunk/rosapps/sysutils/ctm/ctm.h	2005-04-26 16:28:38 UTC (rev
14817)
@@ -51,6 +51,7 @@

 
 	TIME				UserTime;
 	TIME				KernelTime;
+	LARGE_INTEGER			CreateTime;
 } PERFDATA, *PPERFDATA;
 
 #define SystemTimeInformation			3
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-diffs/attachments/20050426/ae16fe63/attachment.html


More information about the Ros-diffs mailing list