(svn r2590) Fix: [network] Fixed NetworkHandleLocalQueue
authorludde
Sat, 16 Jul 2005 14:29:36 +0000
changeset 2080 cee8c96659b1
parent 2079 c9c32cf56cb9
child 2081 d17c3514b6da
(svn r2590) Fix: [network] Fixed NetworkHandleLocalQueue
network.c
--- a/network.c	Sat Jul 16 12:59:23 2005 +0000
+++ b/network.c	Sat Jul 16 14:29:36 2005 +0000
@@ -1101,37 +1101,38 @@
 // Handle the local-command-queue
 static void NetworkHandleLocalQueue(void)
 {
-	if (_local_command_queue != NULL) {
-		CommandPacket *cp;
-		CommandPacket *cp_prev;
-
-		cp = _local_command_queue;
-		cp_prev = NULL;
-
-		while (cp != NULL) {
-			if (_frame_counter > cp->frame) {
-				// We can execute this command
-				NetworkExecuteCommand(cp);
+	CommandPacket *cp, **cp_prev;
 
-				if (cp_prev != NULL) {
-					cp_prev->next = cp->next;
-					free(cp);
-					cp = cp_prev->next;
-				} else {
-					// This means we are at our first packet
-					_local_command_queue = cp->next;
-					free(cp);
-					cp = _local_command_queue;
-				}
+	cp_prev = &_local_command_queue;
 
-			} else {
-				// Command is in the future, skip to next
-				//  (commands don't have to be in order in the queue!!)
-				cp_prev = cp;
-				cp = cp->next;
-			}
+	while ( (cp = *cp_prev) != NULL) {
+
+		// The queue is always in order, which means
+		// that the first element will be executed first.
+		if (_frame_counter < cp->frame)
+			break;
+
+		if (_frame_counter > cp->frame) {
+			// If we reach here, it means for whatever reason, we've already executed
+			// past the command we need to execute.
+			DEBUG(net, 0)("[NET] Trying to execute a packet in the past!");
+			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)