ra4king / CircuitSim

Basic Circuit Simulator
https://ra4king.github.io/CircuitSim
BSD 3-Clause "New" or "Revised" License
76 stars 28 forks source link

java.lang.IllegalArgumentException: Link has no circuit! #46

Closed ra4king closed 2 years ago

ra4king commented 5 years ago

From error reports:

java.lang.IllegalArgumentException: Link has no circuit! at com.ra4king.circuitsim.simulator.CircuitState.get(CircuitState.java:128) at com.ra4king.circuitsim.simulator.CircuitState.isShortCircuited(CircuitState.java:105) at com.ra4king.circuitsim.gui.GuiUtils.setBitColor(GuiUtils.java:207) at com.ra4king.circuitsim.gui.Connection.paint(Connection.java:62) at com.ra4king.circuitsim.gui.CircuitBoard.paintComponent(CircuitBoard.java:1241) at com.ra4king.circuitsim.gui.CircuitBoard.lambda$paint$31(CircuitBoard.java:1181) at java.base/java.lang.Iterable.forEach(Unknown Source) at com.ra4king.circuitsim.gui.CircuitBoard.paint(CircuitBoard.java:1179) at com.ra4king.circuitsim.gui.CircuitManager.paint(CircuitManager.java:371) at com.ra4king.circuitsim.gui.CircuitSim$2.handle(CircuitSim.java:2506) at javafx.graphics/javafx.animation.AnimationTimer$AnimationTimerReceiver.lambda$handle$0(Unknown Source) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/javafx.animation.AnimationTimer$AnimationTimerReceiver.handle(Unknown Source) at javafx.graphics/com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(Unknown Source) at javafx.graphics/com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(Unknown Source) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(Unknown Source) at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(Unknown Source) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)

ra4king commented 2 years ago

I think this is just an unfortunate side effect of doing fast and cheap painting without holding any locks. The most likely culprit is that in CircuitBoard, it's using a stale CircuitState while using latest links. This could lead to those links not having the right state within this stale CircuitState.

ra4king commented 2 years ago

This should be fixed with commits: 6472a7639abde7f4d076dd7c491aef83ab17ff8d, dd3f74331b04368ba66eaab3093bf072c41ac6cf, 3919279cf427b3e25a0012271fc06ccb63c37ec6, db97c8de2dab396305975d92f659bc8d1970431b, and e64eeb8deb0c9e936d12fdf3c18ccdec11cf6b0c