CmdPal: Adding a lock around perf monitor updates (#46061)

Based on reported bug in Teams.

Added lock around OnLoadBasePage._loadCount and modified
PerformanceWidgetPage to use Interlocked.Increment/Decrement on
_loadCount.

---------

Co-authored-by: leileizhang <leilzh@microsoft.com>
Co-authored-by: Niels Laute <niels.laute@live.nl>
Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com>
Co-authored-by: Yu Leng <yuleng@microsoft.com>
Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com>
Co-authored-by: Jiří Polášek <me@jiripolasek.com>
Co-authored-by: Shawn Yuan <128874481+shuaiyuanxx@users.noreply.github.com>
Co-authored-by: Gordon Lam <73506701+yeelam-gordon@users.noreply.github.com>
Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com>
Co-authored-by: Mike Hall <mikehall@microsoft.com>
Co-authored-by: vanzue <vanzue@outlook.com>
Co-authored-by: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com>
Co-authored-by: Thanh Nguyen <74597207+ThanhNguyxn@users.noreply.github.com>
Co-authored-by: Zach Teutsch <88554871+zateutsch@users.noreply.github.com>
This commit is contained in:
Michael Jolley
2026-03-11 14:06:44 -07:00
committed by GitHub
parent 39bbf0593e
commit b81ea23c68
6 changed files with 82 additions and 15 deletions

View File

@@ -16,6 +16,7 @@ adaptivecards
ADDSTRING ADDSTRING
ADDUNDORECORD ADDUNDORECORD
ADifferent ADifferent
ADMINS
adml adml
admx admx
advfirewall advfirewall
@@ -169,7 +170,11 @@ cim
CImage CImage
cla cla
CLASSDC CLASSDC
classguid
classmethod
CLASSNOTAVAILABLE CLASSNOTAVAILABLE
claude
CLEARTYPE
clickable clickable
clickonce clickonce
clientside clientside
@@ -201,6 +206,7 @@ colorformat
colorhistory colorhistory
colorhistorylimit colorhistorylimit
COLORKEY COLORKEY
colorref
comctl comctl
comdlg comdlg
comexp comexp
@@ -218,6 +224,7 @@ CONTEXTHELP
CONTEXTMENUHANDLER CONTEXTMENUHANDLER
contractversion contractversion
CONTROLPARENT CONTROLPARENT
Convs
cooldown cooldown
copiedcolorrepresentation copiedcolorrepresentation
COPYPEN COPYPEN
@@ -229,6 +236,8 @@ cpcontrols
cph cph
cplusplus cplusplus
CPower CPower
cpptools
cppvsdbg
cppwinrt cppwinrt
createdump createdump
CREATEPROCESS CREATEPROCESS
@@ -251,6 +260,8 @@ CTLCOLORSTATIC
CURRENTDIR CURRENTDIR
CURSORINFO CURSORINFO
cursorpos cursorpos
CURSORSHOWING
cursorwrap
customaction customaction
CUSTOMACTIONTEST CUSTOMACTIONTEST
CVal CVal
@@ -267,12 +278,14 @@ dacl
datareader datareader
datatracker datatracker
Dayof Dayof
dbcc
DBID DBID
DBLCLKS DBLCLKS
DBLEPSILON DBLEPSILON
DBPROP DBPROP
DBPROPIDSET DBPROPIDSET
DBPROPSET DBPROPSET
DBT
DCBA DCBA
DCOM DCOM
DComposition DComposition
@@ -288,6 +301,8 @@ DEFAULTFLAGS
DEFAULTICON DEFAULTICON
defaultlib defaultlib
DEFAULTONLY DEFAULTONLY
DEFAULTSIZE
defaulttonearest
DEFAULTTONULL DEFAULTTONULL
DEFAULTTOPRIMARY DEFAULTTOPRIMARY
DEFERERASE DEFERERASE
@@ -307,11 +322,21 @@ DESKTOPABSOLUTEPARSING
desktopshorcutinstalled desktopshorcutinstalled
devblogs devblogs
devdocs devdocs
devenv
DEVICEINTERFACE
devicetype
DEVINTERFACE
devmgmt devmgmt
DEVMODE DEVMODE
DEVMODEW DEVMODEW
DEVNODES
devpal devpal
DEVTYP
dfx
DIALOGEX DIALOGEX
diffs
digicert
DINORMAL
DISABLEASACTIONKEY DISABLEASACTIONKEY
DISABLENOSCROLL DISABLENOSCROLL
diskmgmt diskmgmt
@@ -425,6 +450,12 @@ eyetracker
FANCYZONESDRAWLAYOUTTEST FANCYZONESDRAWLAYOUTTEST
FANCYZONESEDITOR FANCYZONESEDITOR
FARPROC FARPROC
fdw
fdx
FErase
fesf
FFFF
Figma
FILEEXPLORER FILEEXPLORER
FILEFLAGS FILEFLAGS
FILEFLAGSMASK FILEFLAGSMASK
@@ -441,6 +472,7 @@ FILESYSPATH
Filetime Filetime
FILEVERSION FILEVERSION
FILTERMODE FILTERMODE
FInc
findfast findfast
FIXEDFILEINFO FIXEDFILEINFO
FIXEDSYS FIXEDSYS
@@ -526,11 +558,13 @@ HCRYPTPROV
hcursor hcursor
hcwhite hcwhite
hdc hdc
HDEVNOTIFY
hdr hdr
hdrop hdrop
hdwwiz hdwwiz
Helpline Helpline
helptext helptext
hgdiobj
HGFE HGFE
hglobal hglobal
hhk hhk
@@ -675,6 +709,7 @@ jfif
jgeosdfsdsgmkedfgdfgdfgbkmhcgcflmi jgeosdfsdsgmkedfgdfgdfgbkmhcgcflmi
jjw jjw
jobject jobject
JOBOBJECT
jpe jpe
jpnime jpnime
Jsons Jsons
@@ -709,6 +744,7 @@ Ldone
Ldr Ldr
LEFTSCROLLBAR LEFTSCROLLBAR
LEFTTEXT LEFTTEXT
leftclick
LError LError
LEVELID LEVELID
LExit LExit
@@ -740,6 +776,8 @@ lowlevel
LOWORD LOWORD
lparam lparam
LPBITMAPINFOHEADER LPBITMAPINFOHEADER
LPCFHOOKPROC
lpch
LPCITEMIDLIST LPCITEMIDLIST
LPCLSID LPCLSID
lpcmi lpcmi
@@ -757,6 +795,7 @@ LPMONITORINFO
LPOSVERSIONINFOEXW LPOSVERSIONINFOEXW
LPQUERY LPQUERY
lprc lprc
LPrivate
LPSAFEARRAY LPSAFEARRAY
lpstr lpstr
lpsz lpsz
@@ -803,6 +842,8 @@ MAXSHORTCUTSIZE
maxversiontested maxversiontested
MBM MBM
MBR MBR
Mbuttondown
mcp
MDICHILD MDICHILD
MDL MDL
mdtext mdtext
@@ -814,7 +855,10 @@ MENUITEMINFO
MENUITEMINFOW MENUITEMINFOW
MERGECOPY MERGECOPY
MERGEPAINT MERGEPAINT
Metacharacter
metadatamatters
Metadatas Metadatas
Metacharacter
metafile metafile
metapackage metapackage
mfc mfc
@@ -841,6 +885,7 @@ mmsys
mobileredirect mobileredirect
mockapi mockapi
MODALFRAME MODALFRAME
modelcontextprotocol
MODESPRUNED MODESPRUNED
MONITORENUMPROC MONITORENUMPROC
MONITORINFO MONITORINFO
@@ -875,7 +920,9 @@ MSLLHOOKSTRUCT
Mso Mso
msrc msrc
msstore msstore
mstsc
msvcp msvcp
MT
MTND MTND
mtrue mtrue
MULTIPLEUSE MULTIPLEUSE
@@ -885,6 +932,8 @@ mvvm
MVVMTK MVVMTK
MWBEx MWBEx
MYICON MYICON
myorg
myrepo
NAMECHANGE NAMECHANGE
namespaceanddescendants namespaceanddescendants
nao nao
@@ -1009,6 +1058,7 @@ openas
opencode opencode
OPENFILENAME OPENFILENAME
opensource opensource
openurl
openxmlformats openxmlformats
OPTIMIZEFORINVOKE OPTIMIZEFORINVOKE
ORPHANEDDIALOGTITLE ORPHANEDDIALOGTITLE
@@ -1203,6 +1253,7 @@ RAWPATH
rbhid rbhid
rclsid rclsid
RCZOOMIT RCZOOMIT
rdp
RDW RDW
READMODE READMODE
READOBJECTS READOBJECTS
@@ -1230,6 +1281,7 @@ remappings
REMAPSUCCESSFUL REMAPSUCCESSFUL
REMAPUNSUCCESSFUL REMAPUNSUCCESSFUL
Remotable Remotable
remotedesktop
remoteip remoteip
Removelnk Removelnk
renamable renamable
@@ -1260,6 +1312,7 @@ RIGHTSCROLLBAR
riid riid
RKey RKey
RNumber RNumber
rollups
rop rop
ROUNDSMALL ROUNDSMALL
rpcrt rpcrt
@@ -1471,6 +1524,9 @@ SVGIO
svgz svgz
SVSI SVSI
SWFO SWFO
swp
SWPNOSIZE
SWPNOZORDER
SWRESTORE SWRESTORE
symbolrequestprod symbolrequestprod
SYMCACHE SYMCACHE
@@ -1487,6 +1543,8 @@ SYSKEY
syskeydown syskeydown
SYSKEYUP SYSKEYUP
SYSLIB SYSLIB
sysmenu
systemai
SYSTEMAPPS SYSTEMAPPS
SYSTEMMODAL SYSTEMMODAL
SYSTEMTIME SYSTEMTIME
@@ -1573,6 +1631,9 @@ UHash
UIA UIA
UIEx UIEx
ULONGLONG ULONGLONG
Ultrawide
UMax
UMin
ums ums
uncompilable uncompilable
UNCPRIORITY UNCPRIORITY

View File

@@ -26,7 +26,7 @@
<PackageVersion Include="CommunityToolkit.WinUI.Controls.Sizers" Version="8.2.250402" /> <PackageVersion Include="CommunityToolkit.WinUI.Controls.Sizers" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.WinUI.Converters" Version="8.2.250402" /> <PackageVersion Include="CommunityToolkit.WinUI.Converters" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.WinUI.Extensions" Version="8.2.250402" /> <PackageVersion Include="CommunityToolkit.WinUI.Extensions" Version="8.2.250402" />
<PackageVersion Include="CommunityToolkit.WinUI.UI.Controls.DataGrid" Version="7.1.2" /> <PackageVersion Include="CommunityToolkit.WinUI.UI.Controls.DataGrid" Version="7.1.2" />
<PackageVersion Include="CommunityToolkit.Labs.WinUI.Controls.MarkdownTextBlock" Version="0.1.260116-build.2514" /> <PackageVersion Include="CommunityToolkit.Labs.WinUI.Controls.MarkdownTextBlock" Version="0.1.260116-build.2514" />
<PackageVersion Include="ControlzEx" Version="6.0.0" /> <PackageVersion Include="ControlzEx" Version="6.0.0" />
<PackageVersion Include="HelixToolkit" Version="2.24.0" /> <PackageVersion Include="HelixToolkit" Version="2.24.0" />

View File

@@ -14,7 +14,6 @@ void MonitorTopology::Initialize(const std::vector<MonitorInfo>& monitors)
Logger::info(L"======= TOPOLOGY INITIALIZATION START ======="); Logger::info(L"======= TOPOLOGY INITIALIZATION START =======");
Logger::info(L"Initializing edge-based topology for {} monitors", monitors.size()); Logger::info(L"Initializing edge-based topology for {} monitors", monitors.size());
m_monitors = monitors; m_monitors = monitors;
m_outerEdges.clear(); m_outerEdges.clear();
m_edgeMap.clear(); m_edgeMap.clear();
@@ -692,7 +691,6 @@ int MonitorTopology::GetAbsolutePosition(const MonitorEdge& edge, double relativ
return static_cast<int>(result); return static_cast<int>(result);
} }
std::vector<MonitorTopology::GapInfo> MonitorTopology::DetectMonitorGaps() const std::vector<MonitorTopology::GapInfo> MonitorTopology::DetectMonitorGaps() const
{ {
std::vector<GapInfo> gaps; std::vector<GapInfo> gaps;

View File

@@ -19,7 +19,6 @@ public sealed partial class AppListItem : ListItem, IPrecomputedListItem
{ {
private readonly AppCommand _appCommand; private readonly AppCommand _appCommand;
private readonly AppItem _app; private readonly AppItem _app;
private readonly Lazy<Task<IconInfo?>> _iconLoadTask; private readonly Lazy<Task<IconInfo?>> _iconLoadTask;
private readonly Lazy<Task<Details>> _detailsLoadTask; private readonly Lazy<Task<Details>> _detailsLoadTask;

View File

@@ -3,6 +3,7 @@
// See the LICENSE file in the project root for more information. // See the LICENSE file in the project root for more information.
using System; using System;
using System.Threading;
using Microsoft.CommandPalette.Extensions; using Microsoft.CommandPalette.Extensions;
using Microsoft.CommandPalette.Extensions.Toolkit; using Microsoft.CommandPalette.Extensions.Toolkit;
using Windows.Foundation; using Windows.Foundation;
@@ -70,6 +71,7 @@ internal abstract partial class OnLoadContentPage : OnLoadBasePage, IContentPage
internal abstract partial class OnLoadBasePage : Page internal abstract partial class OnLoadBasePage : Page
{ {
private readonly Lock _loadLock = new();
private int _loadCount; private int _loadCount;
#pragma warning disable CS0067 // The event is never used #pragma warning disable CS0067 // The event is never used
@@ -82,22 +84,28 @@ internal abstract partial class OnLoadBasePage : Page
add add
{ {
InternalItemsChanged += value; InternalItemsChanged += value;
if (_loadCount == 0) lock (_loadLock)
{ {
Loaded(); if (_loadCount == 0)
} {
Loaded();
}
_loadCount++; _loadCount++;
}
} }
remove remove
{ {
InternalItemsChanged -= value; InternalItemsChanged -= value;
_loadCount--; lock (_loadLock)
_loadCount = Math.Max(0, _loadCount);
if (_loadCount == 0)
{ {
Unloaded(); _loadCount--;
_loadCount = Math.Max(0, _loadCount);
if (_loadCount == 0)
{
Unloaded();
}
} }
} }
} }

View File

@@ -9,6 +9,7 @@ using System.Globalization;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Text.Json.Nodes; using System.Text.Json.Nodes;
using System.Threading;
using CoreWidgetProvider.Helpers; using CoreWidgetProvider.Helpers;
using CoreWidgetProvider.Widgets.Enums; using CoreWidgetProvider.Widgets.Enums;
using Microsoft.CmdPal.Common; using Microsoft.CmdPal.Common;
@@ -262,17 +263,17 @@ internal abstract partial class WidgetPage : OnLoadContentPage
/// </summary> /// </summary>
internal virtual void PushActivate() internal virtual void PushActivate()
{ {
_loadCount++; Interlocked.Increment(ref _loadCount);
} }
internal virtual void PopActivate() internal virtual void PopActivate()
{ {
_loadCount--; Interlocked.Decrement(ref _loadCount);
} }
private int _loadCount; private int _loadCount;
protected bool IsActive => _loadCount > 0; protected bool IsActive => Volatile.Read(ref _loadCount) > 0;
protected override void Loaded() protected override void Loaded()
{ {