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
|
// 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)
|
||||||
|
|||||||
Reference in New Issue
Block a user