mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-30 05:12:58 +00:00 
			
		
		
		
	Small changes to ComputerThread
- Fix the timeout error message displaying utter rot. - Don't resize the runner array. We don't handle this correctly, so we shouldn't handle it at all. - Increment virtualRuntime after a task has executed.
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; | ||||||
| @@ -113,9 +114,9 @@ public class ComputerThread | |||||||
|             running = true; |             running = true; | ||||||
|             if( monitor == null || !monitor.isAlive() ) (monitor = monitorFactory.newThread( new Monitor() )).start(); |             if( monitor == null || !monitor.isAlive() ) (monitor = monitorFactory.newThread( new Monitor() )).start(); | ||||||
|  |  | ||||||
|             if( runners == null || runners.length != ComputerCraft.computer_threads ) |             if( runners == null ) | ||||||
|             { |             { | ||||||
|                 // TODO: Resize this + kill old runners and start new ones. |                 // TODO: Change the runners lenght on config reloads | ||||||
|                 runners = new TaskRunner[ComputerCraft.computer_threads]; |                 runners = new TaskRunner[ComputerCraft.computer_threads]; | ||||||
|  |  | ||||||
|                 // latency and minPeriod are scaled by 1 + floor(log2(threads)). We can afford to execute tasks for |                 // latency and minPeriod are scaled by 1 + floor(log2(threads)). We can afford to execute tasks for | ||||||
| @@ -159,8 +160,16 @@ public class ComputerThread | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         computerLock.lock(); | ||||||
|  |         try | ||||||
|  |         { | ||||||
|             computerQueue.clear(); |             computerQueue.clear(); | ||||||
|         } |         } | ||||||
|  |         finally | ||||||
|  |         { | ||||||
|  |             computerLock.unlock(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Mark a computer as having work, enqueuing it on the thread. |      * Mark a computer as having work, enqueuing it on the thread. | ||||||
| @@ -175,7 +184,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. | ||||||
| @@ -209,19 +218,20 @@ public class ComputerThread | |||||||
|      * Update the {@link ComputerExecutor#virtualRuntime}s of all running tasks, and then increment the |      * Update the {@link ComputerExecutor#virtualRuntime}s of all running tasks, and then increment the | ||||||
|      * {@link #minimumVirtualRuntime} of the executor. |      * {@link #minimumVirtualRuntime} of the executor. | ||||||
|      */ |      */ | ||||||
|     private static void updateRuntimes() |     private static void updateRuntimes( @Nullable ComputerExecutor current ) | ||||||
|     { |     { | ||||||
|         long minRuntime = Long.MAX_VALUE; |         long minRuntime = Long.MAX_VALUE; | ||||||
|  |  | ||||||
|         // If we've a task on the queue, use that as our base time. |         // If we've a task on the queue, use that as our base time. | ||||||
|         if( !computerQueue.isEmpty() ) minRuntime = computerQueue.first().virtualRuntime; |         if( !computerQueue.isEmpty() ) minRuntime = computerQueue.first().virtualRuntime; | ||||||
|  |  | ||||||
|  |         long now = System.nanoTime(); | ||||||
|  |         int tasks = 1 + computerQueue.size(); | ||||||
|  |  | ||||||
|         // Update all the currently executing tasks |         // Update all the currently executing tasks | ||||||
|         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; | ||||||
| @@ -235,6 +245,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; | ||||||
| @@ -251,7 +267,7 @@ public class ComputerThread | |||||||
|         computerLock.lock(); |         computerLock.lock(); | ||||||
|         try |         try | ||||||
|         { |         { | ||||||
|             updateRuntimes(); |             updateRuntimes( executor ); | ||||||
|  |  | ||||||
|             // Add to the queue, and signal the workers. |             // Add to the queue, and signal the workers. | ||||||
|             if( !executor.afterWork() ) return; |             if( !executor.afterWork() ) return; | ||||||
| @@ -353,7 +369,7 @@ public class ComputerThread | |||||||
|                             { |                             { | ||||||
|                                 // If we've hard aborted but we're still not dead, dump the stack trace and interrupt |                                 // If we've hard aborted but we're still not dead, dump the stack trace and interrupt | ||||||
|                                 // the task. |                                 // the task. | ||||||
|                                 timeoutTask( executor, runner.owner, afterStart ); |                                 timeoutTask( executor, runner.owner ); | ||||||
|                                 runner.owner.interrupt(); |                                 runner.owner.interrupt(); | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
| @@ -432,13 +448,13 @@ public class ComputerThread | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static void timeoutTask( ComputerExecutor executor, Thread thread, long nanotime ) |     private static void timeoutTask( ComputerExecutor executor, Thread thread ) | ||||||
|     { |     { | ||||||
|         if( !ComputerCraft.logPeripheralErrors ) return; |         if( !ComputerCraft.logPeripheralErrors ) return; | ||||||
|  |  | ||||||
|         StringBuilder builder = new StringBuilder() |         StringBuilder builder = new StringBuilder() | ||||||
|             .append( "Terminating computer #" ).append( executor.getComputer().getID() ) |             .append( "Terminating computer #" ).append( executor.getComputer().getID() ) | ||||||
|             .append( " due to timeout (running for " ).append( nanotime / 1e9 ) |             .append( " due to timeout (running for " ).append( executor.timeout.nanoCumulative() * 1e-9 ) | ||||||
|             .append( " seconds). This is NOT a bug, but may mean a computer is misbehaving. " ) |             .append( " seconds). This is NOT a bug, but may mean a computer is misbehaving. " ) | ||||||
|             .append( thread.getName() ) |             .append( thread.getName() ) | ||||||
|             .append( " is currently " ) |             .append( " is currently " ) | ||||||
|   | |||||||
| @@ -106,7 +106,7 @@ public class Config | |||||||
|             computerThreads = config.get( CATEGORY_GENERAL, "computer_threads", ComputerCraft.computer_threads ); |             computerThreads = config.get( CATEGORY_GENERAL, "computer_threads", ComputerCraft.computer_threads ); | ||||||
|             computerThreads |             computerThreads | ||||||
|                 .setMinValue( 1 ) |                 .setMinValue( 1 ) | ||||||
|                 .setRequiresWorldRestart( true ) |                 .setRequiresMcRestart( true ) | ||||||
|                 .setComment( "Set the number of threads computers can run on. A higher number means more computers can run at once, but may induce lag.\n" + |                 .setComment( "Set the number of threads computers can run on. A higher number means more computers can run at once, but may induce lag.\n" + | ||||||
|                     "Please note that some mods may not work with a thread count higher than 1. Use with caution." ); |                     "Please note that some mods may not work with a thread count higher than 1. Use with caution." ); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 SquidDev
					SquidDev