1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-09-17 15:02:34 +02:00

Fixed: Unnecessary idle cpu usage

sonarr ref 4386

(cherry picked from commit 5a69801877eb72899dd9867c39a1b88b7114fe5b)

Co-authored-by: Taloth Saldono <Taloth@users.noreply.github.com>
This commit is contained in:
servarr[bot] 2021-03-22 23:21:15 +00:00 committed by GitHub
parent 53b9332675
commit 50ebd283dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 2 deletions

View File

@ -23,6 +23,8 @@ public void Add(CommandModel item)
lock (_mutex)
{
_items.Add(item);
Monitor.PulseAll(_mutex);
}
}
@ -68,6 +70,8 @@ public void RemoveMany(IEnumerable<CommandModel> commands)
{
_items.Remove(command);
}
Monitor.PulseAll(_mutex);
}
}
@ -83,6 +87,8 @@ public bool RemoveIfQueued(int id)
{
_items.Remove(command);
rval = true;
Monitor.PulseAll(_mutex);
}
}
@ -102,14 +108,39 @@ public IEnumerable<CommandModel> GetConsumingEnumerable()
public IEnumerable<CommandModel> GetConsumingEnumerable(CancellationToken cancellationToken)
{
cancellationToken.Register(PulseAllConsumers);
while (!cancellationToken.IsCancellationRequested)
{
if (TryGet(out var command))
CommandModel command = null;
lock (_mutex)
{
if (cancellationToken.IsCancellationRequested)
{
break;
}
if (!TryGet(out command))
{
Monitor.Wait(_mutex);
continue;
}
}
if (command != null)
{
yield return command;
}
}
}
Thread.Sleep(10);
public void PulseAllConsumers()
{
// Signal all consumers to reevaluate cancellation token
lock (_mutex)
{
Monitor.PulseAll(_mutex);
}
}

View File

@ -188,6 +188,8 @@ public void Start(CommandModel command)
public void Complete(CommandModel command, string message)
{
Update(command, CommandStatus.Completed, message);
_commandQueue.PulseAllConsumers();
}
public void Fail(CommandModel command, string message, Exception e)
@ -195,6 +197,8 @@ public void Fail(CommandModel command, string message, Exception e)
command.Exception = e.ToString();
Update(command, CommandStatus.Failed, message);
_commandQueue.PulseAllConsumers();
}
public void Requeue()