mirror of https://github.com/OpenTTD/OpenTTD
(svn r2590) Fix: [network] Fixed NetworkHandleLocalQueue
parent
8ff1f8c526
commit
bd974bb443
51
network.c
51
network.c
|
@ -1101,37 +1101,38 @@ static void NetworkSend(void)
|
||||||
// Handle the local-command-queue
|
// Handle the local-command-queue
|
||||||
static void NetworkHandleLocalQueue(void)
|
static void NetworkHandleLocalQueue(void)
|
||||||
{
|
{
|
||||||
if (_local_command_queue != NULL) {
|
CommandPacket *cp, **cp_prev;
|
||||||
CommandPacket *cp;
|
|
||||||
CommandPacket *cp_prev;
|
|
||||||
|
|
||||||
cp = _local_command_queue;
|
cp_prev = &_local_command_queue;
|
||||||
cp_prev = NULL;
|
|
||||||
|
|
||||||
while (cp != NULL) {
|
while ( (cp = *cp_prev) != NULL) {
|
||||||
if (_frame_counter > cp->frame) {
|
|
||||||
// We can execute this command
|
|
||||||
NetworkExecuteCommand(cp);
|
|
||||||
|
|
||||||
if (cp_prev != NULL) {
|
// The queue is always in order, which means
|
||||||
cp_prev->next = cp->next;
|
// that the first element will be executed first.
|
||||||
free(cp);
|
if (_frame_counter < cp->frame)
|
||||||
cp = cp_prev->next;
|
break;
|
||||||
} else {
|
|
||||||
// This means we are at our first packet
|
|
||||||
_local_command_queue = cp->next;
|
|
||||||
free(cp);
|
|
||||||
cp = _local_command_queue;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
if (_frame_counter > cp->frame) {
|
||||||
// Command is in the future, skip to next
|
// If we reach here, it means for whatever reason, we've already executed
|
||||||
// (commands don't have to be in order in the queue!!)
|
// past the command we need to execute.
|
||||||
cp_prev = cp;
|
DEBUG(net, 0)("[NET] Trying to execute a packet in the past!");
|
||||||
cp = cp->next;
|
assert(0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We can execute this command
|
||||||
|
NetworkExecuteCommand(cp);
|
||||||
|
|
||||||
|
*cp_prev = cp->next;
|
||||||
|
free(cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Just a safety check, to be removed in the future.
|
||||||
|
// Make sure that no older command appears towards the end of the queue
|
||||||
|
// In that case we missed executing it. This will never happen.
|
||||||
|
for(cp = _local_command_queue; cp; cp = cp->next) {
|
||||||
|
assert(_frame_counter < cp->frame);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool NetworkDoClientLoop(void)
|
static bool NetworkDoClientLoop(void)
|
||||||
|
|
Loading…
Reference in New Issue