[WIP] Simplify and optimize PriorityQueue logic

This commit is contained in:
Yoshi Askharoun
2026-07-27 01:28:09 -05:00
parent a8d6f8fbe6
commit 272cc14649
+36 -24
View File
@@ -5,6 +5,7 @@
// Assembly location: C:\Program Files\Zune\UIX.dll // Assembly location: C:\Program Files\Zune\UIX.dll
using System; using System;
using Microsoft.Iris.Debug;
namespace Microsoft.Iris.Queues namespace Microsoft.Iris.Queues
{ {
@@ -131,37 +132,50 @@ namespace Microsoft.Iris.Queues
private QueueItem GetNextItemWorker(int subsetMask, bool ignoreLocks) private QueueItem GetNextItemWorker(int subsetMask, bool ignoreLocks)
{ {
int mask = BeginReadLoop(subsetMask, ignoreLocks); #if DEBUG
for (var q = 0; q < _queues.Length; q++)
{
var queue = _queues[q];
var isEmpty = queue switch
{
Input.InputQueue inputQueue => inputQueue.IsEmpty,
SimpleQueue simpleQueue => simpleQueue.IsEmpty,
_ => throw new Exception()
};
if (!isEmpty)
Trace.WriteLine(TraceCategory.Queues, "Queue {0} has items", q);
}
#endif
var mask = BeginReadLoop(subsetMask, ignoreLocks);
QueueItem queueItem = null; QueueItem queueItem = null;
while (mask != 0) while (mask != 0)
{ {
int lowestBit = FindLowestBit(mask); var lowestBit = FindLowestBit(mask);
Trace.WriteLine(TraceCategory.Queues, "Checking Queue {0}", lowestBit);
queueItem = _queues[lowestBit].GetNextItem(); queueItem = _queues[lowestBit].GetNextItem();
if (queueItem == null) if (queueItem != null)
{ break;
SetWake(lowestBit, false); SetWake(lowestBit, false);
PriorityQueue.HookProc drainHook = _drainHooks[lowestBit]; var drainHook = _drainHooks[lowestBit];
if (drainHook != null) if (drainHook != null)
{ {
bool didWork; drainHook(out var didWork, out var abort);
bool abort; if (abort)
drainHook(out didWork, out abort); break;
if (!abort)
{
if (didWork) if (didWork)
{ {
mask = BeginReadLoop(subsetMask, ignoreLocks); mask = BeginReadLoop(subsetMask, ignoreLocks);
continue; continue;
} }
} }
else
break;
}
mask &= ~(1 << lowestBit); mask &= ~(1 << lowestBit);
} }
else
break;
}
return queueItem; return queueItem;
} }
@@ -170,15 +184,13 @@ namespace Microsoft.Iris.Queues
if (!ignoreLocks) if (!ignoreLocks)
subsetMask &= ~_lockMask; subsetMask &= ~_lockMask;
subsetMask &= _wakeMask | _hookMask; subsetMask &= _wakeMask | _hookMask;
if (subsetMask != 0 && _loopHook != null)
{ if (subsetMask == 0 || _loopHook == null)
bool didWork;
bool abort;
_loopHook(out didWork, out abort);
if (abort)
subsetMask = 0;
}
return subsetMask; return subsetMask;
_loopHook(out _, out var abort);
return abort ? 0 : subsetMask;
} }
private void SetWake(int priority, bool value) private void SetWake(int priority, bool value)