mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-11-03 23:22:59 +00:00 
			
		
		
		
	Fix ComputerThread not updating the minimumVirtualRuntime
We attempted to simplify this 0bfb7049b0,
but that change now means that minimumVirtualRuntime is not updated. As
a result, new tasks will have a runtime of 0 when the queue is empty.
			
			
This commit is contained in:
		@@ -10,6 +10,7 @@ import dan200.computercraft.ComputerCraft;
 | 
				
			|||||||
import dan200.computercraft.shared.util.ThreadUtils;
 | 
					import dan200.computercraft.shared.util.ThreadUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import javax.annotation.Nonnull;
 | 
					import javax.annotation.Nonnull;
 | 
				
			||||||
 | 
					import javax.annotation.Nullable;
 | 
				
			||||||
import java.util.TreeSet;
 | 
					import java.util.TreeSet;
 | 
				
			||||||
import java.util.concurrent.ThreadFactory;
 | 
					import java.util.concurrent.ThreadFactory;
 | 
				
			||||||
import java.util.concurrent.TimeUnit;
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
@@ -205,7 +206,7 @@ public class ComputerThread
 | 
				
			|||||||
            if( executor.onComputerQueue ) throw new IllegalStateException( "Cannot queue already queued executor" );
 | 
					            if( executor.onComputerQueue ) throw new IllegalStateException( "Cannot queue already queued executor" );
 | 
				
			||||||
            executor.onComputerQueue = true;
 | 
					            executor.onComputerQueue = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            updateRuntimes();
 | 
					            updateRuntimes( null );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // We're not currently on the queue, so update its current execution time to
 | 
					            // We're not currently on the queue, so update its current execution time to
 | 
				
			||||||
            // ensure its at least as high as the minimum.
 | 
					            // ensure its at least as high as the minimum.
 | 
				
			||||||
@@ -241,7 +242,7 @@ public class ComputerThread
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * This is called before queueing tasks, to ensure that {@link #minimumVirtualRuntime} is up-to-date.
 | 
					     * This is called before queueing tasks, to ensure that {@link #minimumVirtualRuntime} is up-to-date.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private static void updateRuntimes()
 | 
					    private static void updateRuntimes( @Nullable ComputerExecutor current )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        long minRuntime = Long.MAX_VALUE;
 | 
					        long minRuntime = Long.MAX_VALUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -249,12 +250,11 @@ public class ComputerThread
 | 
				
			|||||||
        if( !computerQueue.isEmpty() ) minRuntime = computerQueue.first().virtualRuntime;
 | 
					        if( !computerQueue.isEmpty() ) minRuntime = computerQueue.first().virtualRuntime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Update all the currently executing tasks
 | 
					        // Update all the currently executing tasks
 | 
				
			||||||
 | 
					        long now = System.nanoTime();
 | 
				
			||||||
 | 
					        int tasks = 1 + computerQueue.size();
 | 
				
			||||||
        TaskRunner[] currentRunners = runners;
 | 
					        TaskRunner[] currentRunners = runners;
 | 
				
			||||||
        if( currentRunners != null )
 | 
					        if( currentRunners != null )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            long now = System.nanoTime();
 | 
					 | 
				
			||||||
            int tasks = 1 + computerQueue.size();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            for( TaskRunner runner : currentRunners )
 | 
					            for( TaskRunner runner : currentRunners )
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if( runner == null ) continue;
 | 
					                if( runner == null ) continue;
 | 
				
			||||||
@@ -268,6 +268,12 @@ public class ComputerThread
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // And update the most recently executed one (if set).
 | 
				
			||||||
 | 
					        if( current != null )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            minRuntime = Math.min( minRuntime, current.virtualRuntime += (now - current.vRuntimeStart) / tasks );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if( minRuntime > minimumVirtualRuntime && minRuntime < Long.MAX_VALUE )
 | 
					        if( minRuntime > minimumVirtualRuntime && minRuntime < Long.MAX_VALUE )
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            minimumVirtualRuntime = minRuntime;
 | 
					            minimumVirtualRuntime = minRuntime;
 | 
				
			||||||
@@ -296,9 +302,7 @@ public class ComputerThread
 | 
				
			|||||||
        computerLock.lock();
 | 
					        computerLock.lock();
 | 
				
			||||||
        try
 | 
					        try
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            // Update the virtual runtime of this task.
 | 
					            updateRuntimes( executor );
 | 
				
			||||||
            long now = System.nanoTime();
 | 
					 | 
				
			||||||
            executor.virtualRuntime += (now - executor.vRuntimeStart) / (1 + computerQueue.size());
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // If we've no more tasks, just return.
 | 
					            // If we've no more tasks, just return.
 | 
				
			||||||
            if( !executor.afterWork() ) return;
 | 
					            if( !executor.afterWork() ) return;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user