#include "config.h"
#endif
-#include <limits>
#include "ServerQueue.H"
+
+#include <limits>
+
+#include "Bot.H"
+#include "ServerQueueItem.H"
#include "Utils.H"
+#ifdef USESCRIPTS
+#include "BotInterp.H"
+#include "Interp.H"
+#endif
+
+int ServerQueue::max_penalty = 20;
+
ServerQueue::ServerQueue(Socket * s, bool d)
: Queue(s,d), penalty(0)
{
void
ServerQueue::addItem(ServerQueueItem *sqi)
{
+ BotLock queue_lock (queue_mutex);
std::list<ServerQueueItem *>::iterator it, it2;
for (it = serverQueue.begin(); it != serverQueue.end(); ++it)
{
- if ((*it)->priority > sqi->priority)
+ if (**it < *sqi)
{
break;
}
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)
{
penalty--;
}
- while (!serverQueue.empty() && (penalty < 5))
+ while (!serverQueue.empty() && (penalty < max_penalty))
{
- ServerQueueItem * sqi = (*serverQueue.begin());
- penalty += sqi->penalty + sqi->getLine().length()/100 + 1;
+ ServerQueueItem * sqi = serverQueue.front ();
+ penalty += sqi->penalty + sqi->getLine().length()/100;
bool res = sendLine(sqi->getLine());
- serverQueue.erase(serverQueue.begin());
+
+ serverQueue.pop_front ();
delete sqi;
if (!res)