Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace System.Windows.Input

internal sealed class PenThread
{
private PenThreadWorker _penThreadWorker;
private readonly PenThreadWorker _penThreadWorker;

internal PenThread()
{
Expand All @@ -37,13 +37,14 @@ internal void Dispose()

private void DisposeHelper()
{
// NOTE: PenThreadWorker deals with already being disposed logic.
_penThreadWorker?.Dispose();
_penThreadWorker.Dispose();
GC.KeepAlive(this);
}

/////////////////////////////////////////////////////////////////////

internal bool IsDisposed => _penThreadWorker.IsDisposed;

internal bool AddPenContext(PenContext penContext)
{
return _penThreadWorker.WorkerAddPenContext(penContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,20 +93,15 @@ private PenThread GetPenThreadForPenContextHelper(PenContext penContext)
// We scan back to front to enable list cleanup.
for (int i = _penThreadWeakRefList.Count - 1; i >= 0; i--)
{
PenThread candidatePenThread = null;

// Select a thread if it's a valid WeakReference and we're not ignoring it
// Allow selection to happen multiple times so we get the first valid candidate
// in forward order.
if (_penThreadWeakRefList[i].TryGetTarget(out candidatePenThread)
&& !ignoredThreads.Contains(candidatePenThread))
// Check if the WeakReference is still alive and not disposed.
if (!_penThreadWeakRefList[i].TryGetTarget(out PenThread candidatePenThread) ||
candidatePenThread.IsDisposed)
{
selectedPenThread = candidatePenThread;
_penThreadWeakRefList.RemoveAt(i);
}
// This is an invalid WeakReference and should be removed
else if (candidatePenThread == null)
else if (!ignoredThreads.Contains(candidatePenThread))
{
_penThreadWeakRefList.RemoveAt(i);
selectedPenThread = candidatePenThread;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -559,8 +559,15 @@ internal bool WorkerRemovePenContext(PenContext penContext)

/////////////////////////////////////////////////////////////////////

internal bool IsDisposed => __disposed;

internal TabletDeviceInfo[] WorkerGetTabletsInfo()
{
if (__disposed)
{
return Array.Empty<TabletDeviceInfo>();
}

// Set data up for this call
WorkerOperationGetTabletsInfo getTablets = new WorkerOperationGetTabletsInfo();

Expand Down