Made ServerQueue threadsafe
authorclinton <clinton@unknownlamer.org>
Thu, 13 Nov 2008 08:09:54 +0000 (08:09 +0000)
committerclinton <clinton@unknownlamer.org>
Thu, 13 Nov 2008 08:09:54 +0000 (08:09 +0000)
source/ServerQueue.C
source/ServerQueue.H

index 0f13d36..9ed8a83 100644 (file)
@@ -42,6 +42,7 @@ ServerQueue::~ServerQueue()
 void
 ServerQueue::addItem(ServerQueueItem *sqi)
 {
+  BotLock queue_lock (queue_mutex);
   std::list<ServerQueueItem *>::iterator it, it2;
 
   for (it = serverQueue.begin(); it != serverQueue.end(); ++it)
@@ -78,6 +79,11 @@ ServerQueue::addLine(String l, int pr, int pen, int t)
 bool
 ServerQueue::flush()
 {
+  // Locking around the entire queue flush prevents another thread
+  // from spamming the queue and preventing lower priority messages
+  // from ever being sent
+  BotLock flush_lock (queue_mutex);
+
   // Called every second, we decrement the penalty
   if (penalty > 0)
     {
@@ -86,11 +92,12 @@ ServerQueue::flush()
 
   while (!serverQueue.empty() && (penalty < 5)) 
     {
-      ServerQueueItem * sqi = (*serverQueue.begin());
+      ServerQueueItem * sqi = serverQueue.front ();
       penalty += sqi->penalty + sqi->getLine().length()/100 + 1;
 
       bool res = sendLine(sqi->getLine());
-      serverQueue.erase(serverQueue.begin());
+
+      serverQueue.pop_front ();
       delete sqi;
 
       if (!res)
index 399a9ce..2ae808f 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <list>
 
+#include "BotThreading.H"
 #include "String.H"
 #include "Queue.H"
 #include "ServerQueueItem.H"
@@ -56,6 +57,7 @@ class ServerQueue : public Queue {
 
   std::list<ServerQueueItem *> serverQueue;
   int penalty;
+  BotMutex queue_mutex;
 
 public:
   ServerQueue(Socket *, bool);