From 7f1761fcd235caafe8b257357579d2f558e4340c Mon Sep 17 00:00:00 2001
From: Dustyn Gibson <miigotu@gmail.com>
Date: Sat, 11 Jul 2015 02:20:48 -0700
Subject: [PATCH] This commit was lost from cherryPy->Tornado switch, and an
 addition by me - fixes SiCKRAGETV/sickrage-issues#2045

---
 sickbeard/generic_queue.py | 79 ++++++++++++++++++++------------------
 1 file changed, 41 insertions(+), 38 deletions(-)

diff --git a/sickbeard/generic_queue.py b/sickbeard/generic_queue.py
index f97e348a..166c8aaa 100644
--- a/sickbeard/generic_queue.py
+++ b/sickbeard/generic_queue.py
@@ -50,47 +50,50 @@ class GenericQueue(object):
         self.min_priority = 0
 
     def add_item(self, item):
-        item.added = datetime.datetime.now()
-        self.queue.append(item)
+        with self.lock:
+            item.added = datetime.datetime.now()
+            self.queue.append(item)
 
-        return item
+            return item
 
     def run(self, force=False):
-
-        # only start a new task if one isn't already going
-        if self.currentItem is None or not self.currentItem.isAlive():
-
-            # if the thread is dead then the current item should be finished
-            if self.currentItem:
-                self.currentItem.finish()
-                self.currentItem = None
-
-            # if there's something in the queue then run it in a thread and take it out of the queue
-            if len(self.queue) > 0:
-
-                # sort by priority
-                def sorter(x, y):
-                    """
-                    Sorts by priority descending then time ascending
-                    """
-                    if x.priority == y.priority:
-                        if y.added == x.added:
-                            return 0
-                        elif y.added < x.added:
-                            return 1
-                        elif y.added > x.added:
-                            return -1
-                    else:
-                        return y.priority - x.priority
-
-                self.queue.sort(cmp=sorter)
-                if self.queue[0].priority < self.min_priority:
-                    return
-
-                # launch the queue item in a thread
-                self.currentItem = self.queue.pop(0)
-                self.currentItem.name = self.queue_name + '-' + self.currentItem.name
-                self.currentItem.start()
+        with self.lock:
+            # only start a new task if one isn't already going
+            if self.currentItem is None or not self.currentItem.isAlive():
+
+                # if the thread is dead then the current item should be finished
+                if self.currentItem:
+                    self.currentItem.finish()
+                    self.currentItem = None
+
+                # if there's something in the queue then run it in a thread and take it out of the queue
+                if len(self.queue) > 0:
+
+                    # sort by priority
+                    def sorter(x, y):
+                        """
+                        Sorts by priority descending then time ascending
+                        """
+                        if x.priority == y.priority:
+                            if y.added == x.added:
+                                return 0
+                            elif y.added < x.added:
+                                return 1
+                            elif y.added > x.added:
+                                return -1
+                        else:
+                            return y.priority - x.priority
+
+                    self.queue.sort(cmp=sorter)
+                    if self.queue[0].priority < self.min_priority:
+                        return
+
+                    # launch the queue item in a thread
+                    self.currentItem = self.queue.pop(0)
+                    self.currentItem.name = self.queue_name + '-' + self.currentItem.name
+                    self.currentItem.start()
+
+        self.amActive = False
 
 class QueueItem(threading.Thread):
     def __init__(self, name, action_id=0):
-- 
GitLab