void
ServerQueue::addItem(ServerQueueItem *sqi)
{
+ BotLock queue_lock (queue_mutex);
std::list<ServerQueueItem *>::iterator it, it2;
for (it = serverQueue.begin(); it != serverQueue.end(); ++it)
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)
{
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)
#include <list>
+#include "BotThreading.H"
#include "String.H"
#include "Queue.H"
#include "ServerQueueItem.H"
std::list<ServerQueueItem *> serverQueue;
int penalty;
+ BotMutex queue_mutex;
public:
ServerQueue(Socket *, bool);