(svn r21429) -Fix [FS#3771]: the server didn't check for the paused state when allowing to execute commands

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
rubidium 14 years ago
parent 49162ab39b
commit 0c23b0b3a4

@ -141,8 +141,8 @@ public:
/** Clear the command queue. */ /** Clear the command queue. */
~CommandQueue() { this->Free(); } ~CommandQueue() { this->Free(); }
void Append(CommandPacket *p); void Append(CommandPacket *p);
CommandPacket *Pop(); CommandPacket *Pop(bool ignore_paused = false);
CommandPacket *Peek(); CommandPacket *Peek(bool ignore_paused = false);
void Free(); void Free();
/** Get the number of items in the queue. */ /** Get the number of items in the queue. */
uint Count() const { return this->count; } uint Count() const { return this->count; }

@ -75,13 +75,21 @@ void CommandQueue::Append(CommandPacket *p)
/** /**
* Return the first item in the queue and remove it from the queue. * Return the first item in the queue and remove it from the queue.
* @param ignore_paused Whether to ignore commands that may not be executed while paused.
* @return the first item in the queue. * @return the first item in the queue.
*/ */
CommandPacket *CommandQueue::Pop() CommandPacket *CommandQueue::Pop(bool ignore_paused)
{ {
CommandPacket **prev = &this->first;
CommandPacket *ret = this->first; CommandPacket *ret = this->first;
if (ignore_paused && _pause_mode != PM_UNPAUSED) {
while (ret != NULL && !IsCommandAllowedWhilePaused(ret->cmd)) {
prev = &ret->next;
ret = ret->next;
}
}
if (ret != NULL) { if (ret != NULL) {
this->first = this->first->next; *prev = ret->next;
this->count--; this->count--;
} }
return ret; return ret;
@ -89,11 +97,17 @@ CommandPacket *CommandQueue::Pop()
/** /**
* Return the first item in the queue, but don't remove it. * Return the first item in the queue, but don't remove it.
* @param ignore_paused Whether to ignore commands that may not be executed while paused.
* @return the first item in the queue. * @return the first item in the queue.
*/ */
CommandPacket *CommandQueue::Peek() CommandPacket *CommandQueue::Peek(bool ignore_paused)
{ {
return this->first; if (!ignore_paused || _pause_mode == PM_UNPAUSED) return this->first;
for (CommandPacket *p = this->first; p != NULL; p = p->next) {
if (IsCommandAllowedWhilePaused(p->cmd)) return p;
}
return NULL;
} }
/** Free everything that is in the queue. */ /** Free everything that is in the queue. */
@ -251,7 +265,7 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne
int to_go = _settings_client.network.commands_per_frame; int to_go = _settings_client.network.commands_per_frame;
CommandPacket *cp; CommandPacket *cp;
while (--to_go >= 0 && (cp = queue->Pop()) != NULL) { while (--to_go >= 0 && (cp = queue->Pop(true)) != NULL) {
DistributeCommandPacket(*cp, owner); DistributeCommandPacket(*cp, owner);
free(cp); free(cp);
} }

Loading…
Cancel
Save