diff --git a/2.x/trunk/plugins/ExtendedTools/exttools.h b/2.x/trunk/plugins/ExtendedTools/exttools.h index 110efba8c..7b0d5d35f 100644 --- a/2.x/trunk/plugins/ExtendedTools/exttools.h +++ b/2.x/trunk/plugins/ExtendedTools/exttools.h @@ -412,8 +412,12 @@ PPH_STRING EtGetGpuAdapterDescription( __in ULONG Index ); +VOID EtAllocateGpuNodeBitMap( + __out PRTL_BITMAP BitMap + ); + VOID EtUpdateGpuNodeBitMap( - VOID + __in PRTL_BITMAP NewBitMap ); VOID EtQueryProcessGpuStatistics( diff --git a/2.x/trunk/plugins/ExtendedTools/gpumon.c b/2.x/trunk/plugins/ExtendedTools/gpumon.c index 27ff2e2d0..9d29c5449 100644 --- a/2.x/trunk/plugins/ExtendedTools/gpumon.c +++ b/2.x/trunk/plugins/ExtendedTools/gpumon.c @@ -48,6 +48,7 @@ ULONG EtGpuNextNodeIndex = 0; RTL_BITMAP EtGpuNodeBitMap; PULONG EtGpuNodeBitMapBuffer; ULONG EtGpuNodeBitMapBitsSet; +PULONG EtGpuNewNodeBitMapBuffer; PH_UINT64_DELTA EtClockTotalRunningTimeDelta; LARGE_INTEGER EtClockTotalRunningTimeFrequency; @@ -561,6 +562,23 @@ static VOID NTAPI ProcessesUpdatedCallback( if (EtGpuNodeUsage > 1) EtGpuNodeUsage = 1; + // Do the update of the node bitmap if needed. + if (EtGpuNewNodeBitMapBuffer) + { + PULONG newBuffer; + + newBuffer = _InterlockedExchangePointer(&EtGpuNewNodeBitMapBuffer, NULL); + + if (newBuffer) + { + PhFree(EtGpuNodeBitMap.Buffer); + EtGpuNodeBitMap.Buffer = newBuffer; + EtGpuNodeBitMapBuffer = newBuffer; + EtGpuNodeBitMapBitsSet = RtlNumberOfSetBits(&EtGpuNodeBitMap); + EtSaveGpuMonitorSettings(); + } + } + // Update per-process statistics. // Note: no lock is needed because we only ever modify the list on this same thread. @@ -668,11 +686,29 @@ PPH_STRING EtGetGpuAdapterDescription( } } -VOID EtUpdateGpuNodeBitMap( - VOID +VOID EtAllocateGpuNodeBitMap( + __out PRTL_BITMAP BitMap ) { - EtGpuNodeBitMapBitsSet = RtlNumberOfSetBits(&EtGpuNodeBitMap); + SIZE_T numberOfBytes; + + numberOfBytes = BYTES_NEEDED_FOR_BITS(EtGpuTotalNodeCount); + + BitMap->Buffer = PhAllocate(numberOfBytes); + BitMap->SizeOfBitMap = EtGpuTotalNodeCount; + memset(BitMap->Buffer, 0, numberOfBytes); +} + +VOID EtUpdateGpuNodeBitMap( + __in PRTL_BITMAP NewBitMap + ) +{ + PULONG buffer; + + buffer = _InterlockedExchangePointer(&EtGpuNewNodeBitMapBuffer, NewBitMap->Buffer); + + if (buffer) + PhFree(buffer); } VOID EtQueryProcessGpuStatistics( diff --git a/2.x/trunk/plugins/ExtendedTools/gpunodes.c b/2.x/trunk/plugins/ExtendedTools/gpunodes.c index 1831b36e9..a81d45fde 100644 --- a/2.x/trunk/plugins/ExtendedTools/gpunodes.c +++ b/2.x/trunk/plugins/ExtendedTools/gpunodes.c @@ -86,21 +86,21 @@ VOID EtpSaveNodeBitMap( VOID ) { + RTL_BITMAP newBitMap; ULONG i; - RtlClearAllBits(&EtGpuNodeBitMap); + EtAllocateGpuNodeBitMap(&newBitMap); for (i = 0; i < EtGpuTotalNodeCount; i++) { if (Button_GetCheck(CheckBoxHandle[i]) == BST_CHECKED) - RtlSetBits(&EtGpuNodeBitMap, i, 1); + RtlSetBits(&newBitMap, i, 1); } - if (RtlNumberOfSetBits(&EtGpuNodeBitMap) == 0) - RtlSetBits(&EtGpuNodeBitMap, 0, 1); + if (RtlNumberOfSetBits(&newBitMap) == 0) + RtlSetBits(&newBitMap, 0, 1); - EtUpdateGpuNodeBitMap(); - EtSaveGpuMonitorSettings(); + EtUpdateGpuNodeBitMap(&newBitMap); } INT_PTR CALLBACK EtpGpuNodesDlgProc(