Murlakotamus / Boggarton

0 stars 0 forks source link

Выход из игры не завершается остановкой JVM #69

Closed Murlakotamus closed 5 years ago

Murlakotamus commented 6 years ago

Иногда при выходе из игры по ESC джава-машина продолжает работать. Происходит это из-за того, что основной поток не освободил лок на буфере, в то время как виртуальный игрок продолжает ждать его освобождения:

bash-3.2$ jstack -F 81417
Attaching to process ID 81417, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
Deadlock Detection:

No deadlocks found.

Thread 75155: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - sun.awt.AWTAutoShutdown.run() @bci=79, line=314 (Compiled frame)
 - java.lang.Thread.run() @bci=11, line=745 (Compiled frame)

Thread 10243: (state = BLOCKED)

Thread 45575: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Interpreted frame)
 - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Interpreted frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Interpreted frame)
 - com.foxcatgames.boggarton.game.AbstractGame.sendCommand(com.foxcatgames.boggarton.game.utils.ICommand) @bci=16, line=308 (Compiled frame)
 - com.foxcatgames.boggarton.players.virtual.AbstractVirtualAdaptivePlayer.makeMoves(char[]) @bci=108, line=37 (Interpreted frame)
 - com.foxcatgames.boggarton.players.virtual.AbstractVirtualPlayer.run() @bci=49, line=47 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)

Thread 78091: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame)
 - sun.java2d.Disposer.run() @bci=3, line=148 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)

Thread 775: (state = IN_NATIVE)

Thread 17931: (state = BLOCKED)

Thread 12547: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Compiled frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Compiled frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame)

Thread 19459: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.Object.wait() @bci=2, line=502 (Compiled frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Compiled frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)
Murlakotamus commented 6 years ago

Вроде, починилось.

Murlakotamus commented 6 years ago
Продолжает воспроизводиться, но несколько иначе:

Attaching to process ID 18248, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
Deadlock Detection:

No deadlocks found.

Thread 10243: (state = BLOCKED)

Thread 40455: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Compiled frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Compiled frame)
 - com.foxcatgames.boggarton.game.AbstractGame.checkCommand() @bci=16, line=323 (Compiled frame)
 - com.foxcatgames.boggarton.players.virtual.AbstractVirtualAdaptivePlayer.makeMoves(char[]) @bci=133, line=52 (Compiled frame)
 - com.foxcatgames.boggarton.players.virtual.AbstractVirtualPlayer.run() @bci=49, line=47 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=745 (Compiled frame)

Thread 76807: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame)
 - sun.java2d.Disposer.run() @bci=3, line=148 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)

Thread 775: (state = IN_NATIVE)

Thread 14091: (state = BLOCKED)

Thread 19203: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Compiled frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Compiled frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame)

Thread 19715: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.Object.wait() @bci=2, line=502 (Compiled frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Compiled frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)
Murlakotamus commented 6 years ago

На кой чёрт нужно было дожидаться исполнения команды бросания фигуры - не помню напрочь, и без этого всё хорошо работает.

Murlakotamus commented 5 years ago
"virtual player, adaptive, effective: false, 18" #18 prio=1 os_prio=31 tid=0x00007fa395100800 nid=0x1150f in Object.wait() [0x000070000ab80000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:502)
    at com.foxcatgames.boggarton.game.glass.AbstractGlass.waitChanges(AbstractGlass.java:86)
    - locked <0x00000006c0073a98> (a com.foxcatgames.boggarton.game.utils.Changes)
    at com.foxcatgames.boggarton.players.virtual.AbstractMovesExecutor.executeMove(AbstractMovesExecutor.java:68)
    at com.foxcatgames.boggarton.players.virtual.AbstractVirtualPlayer.makeVirtualPlayerMoves(AbstractVirtualPlayer.java:71)
    at com.foxcatgames.boggarton.players.virtual.AbstractVirtualPlayer.run(AbstractVirtualPlayer.java:62)
    at java.lang.Thread.run(Thread.java:745)
Murlakotamus commented 5 years ago

Проблема лежит глубже: запрос на исполнение ходов виртуальным игроком и их выполнение игровой машиной должны быть согласованы, в то время как сейчас есть только запрос на выполнение без обратной связи со стороны игры. Без правильной реализации над этой задачей работать нет смысла, а с правильной - она уйдёт сама собой.