mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
[WIP] Simplify and optimize PriorityQueue logic
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
// Assembly location: C:\Program Files\Zune\UIX.dll
|
||||
|
||||
using System;
|
||||
using Microsoft.Iris.Debug;
|
||||
|
||||
namespace Microsoft.Iris.Queues
|
||||
{
|
||||
@@ -131,37 +132,50 @@ namespace Microsoft.Iris.Queues
|
||||
|
||||
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;
|
||||
while (mask != 0)
|
||||
{
|
||||
int lowestBit = FindLowestBit(mask);
|
||||
var lowestBit = FindLowestBit(mask);
|
||||
Trace.WriteLine(TraceCategory.Queues, "Checking Queue {0}", lowestBit);
|
||||
|
||||
queueItem = _queues[lowestBit].GetNextItem();
|
||||
if (queueItem == null)
|
||||
{
|
||||
if (queueItem != null)
|
||||
break;
|
||||
|
||||
SetWake(lowestBit, false);
|
||||
PriorityQueue.HookProc drainHook = _drainHooks[lowestBit];
|
||||
var drainHook = _drainHooks[lowestBit];
|
||||
if (drainHook != null)
|
||||
{
|
||||
bool didWork;
|
||||
bool abort;
|
||||
drainHook(out didWork, out abort);
|
||||
if (!abort)
|
||||
{
|
||||
drainHook(out var didWork, out var abort);
|
||||
if (abort)
|
||||
break;
|
||||
|
||||
if (didWork)
|
||||
{
|
||||
mask = BeginReadLoop(subsetMask, ignoreLocks);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
mask &= ~(1 << lowestBit);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
return queueItem;
|
||||
}
|
||||
|
||||
@@ -170,15 +184,13 @@ namespace Microsoft.Iris.Queues
|
||||
if (!ignoreLocks)
|
||||
subsetMask &= ~_lockMask;
|
||||
subsetMask &= _wakeMask | _hookMask;
|
||||
if (subsetMask != 0 && _loopHook != null)
|
||||
{
|
||||
bool didWork;
|
||||
bool abort;
|
||||
_loopHook(out didWork, out abort);
|
||||
if (abort)
|
||||
subsetMask = 0;
|
||||
}
|
||||
|
||||
if (subsetMask == 0 || _loopHook == null)
|
||||
return subsetMask;
|
||||
|
||||
_loopHook(out _, out var abort);
|
||||
|
||||
return abort ? 0 : subsetMask;
|
||||
}
|
||||
|
||||
private void SetWake(int priority, bool value)
|
||||
|
||||
Reference in New Issue
Block a user