diff --git a/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java b/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java index ad9c729c1..7ee1b742a 100644 --- a/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java +++ b/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java @@ -251,6 +251,20 @@ void queueStop( boolean reboot, boolean close ) * and then schedule a shutdown. */ void abort() + { + immediateFail( StateCommand.ABORT ); + } + + /** + * Abort this whole computer due to an internal error. This will immediately destroy the Lua machine, + * and then schedule a shutdown. + */ + void fastFail() + { + immediateFail( StateCommand.ERROR ); + } + + private void immediateFail( StateCommand command ) { ILuaMachine machine = this.machine; if( machine != null ) machine.close(); @@ -258,7 +272,7 @@ void abort() synchronized( queueLock ) { if( closed ) return; - command = StateCommand.ABORT; + this.command = command; if( isOn ) enqueue(); } } @@ -596,6 +610,12 @@ void work() throws InterruptedException displayFailure( "Error running computer", TimeoutState.ABORT_MESSAGE ); shutdown(); break; + + case ERROR: + if( !isOn ) return; + displayFailure( "Error running computer", "An internal error occurred, see logs." ); + shutdown(); + break; } } else if( event != null ) @@ -644,6 +664,7 @@ private enum StateCommand SHUTDOWN, REBOOT, ABORT, + ERROR, } private static final class Event diff --git a/src/main/java/dan200/computercraft/core/computer/ComputerThread.java b/src/main/java/dan200/computercraft/core/computer/ComputerThread.java index b07401adc..d190dfefb 100644 --- a/src/main/java/dan200/computercraft/core/computer/ComputerThread.java +++ b/src/main/java/dan200/computercraft/core/computer/ComputerThread.java @@ -506,6 +506,8 @@ public void run() catch( Exception | LinkageError | VirtualMachineError e ) { ComputerCraft.log.error( "Error running task on computer #" + executor.getComputer().getID(), e ); + // Tear down the computer immediately. There's no guarantee it's well behaved from now on. + executor.fastFail(); } finally {