Bug - Fixed Performance issues

Veracity

Developer
Staff member
OK...I just did the following:

- I looked at the available drinks available on Item Manager/Booze. I noticed a few peppermint twist drinks with a 1 adv cost.
- I went to Skill casting and cast Inigo's
- The peppermint twist drinks (correctly) had no adv cost listed.
- I went to Item Manager/Creatable
- I selected a peppermint twist drink and told it to create 2 of them.
- I went back to Item Manager/Booze and I saw that many of the listed drinks were doubled up.

So, there still appears to be corruption in the visibleElements of a shared LockableListModel.

The Booze panel is an ItemManagePanel which has a ShowDescriptionList which uses a mirror image of ConcoctionDatabase.usableList

The Createble panel is an InventoryPanel which is an ItemTableManagePanel which has a ShowDescriptionTable which uses a mirror image of ConcoctionDatabase.creatableList

Those would not appear to clash.

Interestingly enough, however, ConcoctionDatabase.creatableList is a SortedListModel, which we've not examined closely...
 

Veracity

Developer
Staff member
...and my session got Real Slow as I proceeded. Unfortunately, I was not running under Eclipse. I'll have to do that next time and see what I can see.
 

Veracity

Developer
Staff member
OK, Revision 12695 now synchronizes on this.actualElements within LockableListModel and also SortedListModel for any method which manipulates the underlying list. The synchronization wraps around the corresponding update to the visibleElements list, as before.

Now to wait and see if I have somehow introduced deadlocks, again (unlikely) or if I have relaxed the synchronization too much (still unlikely). Speak up if you see problems! :)
 

Veracity

Developer
Staff member
I'm curious to hear how people feel about KoLmafia's performance now. Things we have done in the last couple of weeks:

- Made image caching actually work - and be mandatory - which should, we hope, cut down on requests to KoL from the Relay Browser
- Fixed synchronization in LockableListModel
- Moved to using api.php, rather than charpane.php, for all internal requests for which KoL says to invoke charpane.php
- Use the new api.php?what=closet and api.php?what=storage to dramatically cut down on page loads and processing time at login
- When refreshing inventory, closet, storage, stash, or collection, add everything at once and THEN sort, rather than adding one item at a time with a sort after each one.
- When reading the results of a Mall search, detach the storename from the responseText, rather than keeping hundreds of large responseTexts around until you search again. When I search for "a", my memory usage starts at around 60M or so (Java is a pig) and is still at that value after 300+ requests, as opposed to being stuck at 100M at the end.

My experience, GUI and Relay Browser, has never been this fast, in my memory. And I have not seen it slow down and become unusable even after hours of play in the Relay Browser.

As far as I am concerned, this Bug Report is Fixed. But, as I said above, it's up to Darzil to make that determination - presumably after other users who were complaining about performance declare themselves happy. Funny how people are quick to complain but get real quiet when they no longer have something to complain about. :)

I'm hoping to make a new point release after we support the October IOTM - by which point, I think we'll be in good shape for KOLHS, the Beer Garden, the Folder Holder, Seal Clubber skills, and on and on with all the new stuff which has been coming out recently. If there is nothing obvious to "fix" regarding performance at that time, I suggest we close this Bug Report then.
 

Bale

Minion
But, as I said above, it's up to Darzil to make that determination - presumably after other users who were complaining about performance declare themselves happy. Funny how people are quick to complain but get real quiet when they no longer have something to complain about. :)

On the G-D KoLmafia thread, two people said that their performance problems are fixed and everyone else has simply stopped making posts about Mafia "turning into a slug" or being a "nerve-wrecking crawl" (both actual quotes). Whoa, way to spare our feelings guys! I think that we can count 2 accounts of successes and a sudden lack of general negativity to be resounding success on G-D. I love G-D! [/sarcasm]

Darzil, do we tag this thread fixed?
 

xKiv

Active member
It's not *faster than ever* for me, but that's probably because I am bandwidth-bound. At least I haven't seen any bad symptoms lately (like more than 1.5s pageloads in relay browser combats, getting worse and worse).
The "merged sort" thing even might have sped up my startup time from ~30s to ~23s (as measured by gc:verbose, up to the point where GUI shows up). That's nice, considering how much of that time is me fumbling to enter my password.
 

Fluxxdog

Active member
I've been trying to keep an eye out for hangups before I said it looks good. If you're looking to close, I can add in a hearty thumbs up.
 

Ensiferum

Member
- Use the new api.php?what=closet and api.php?what=storage to dramatically cut down on page loads and processing time at login
This lowered the login time on my main account from ~2 minutes to less than 30 seconds.

The related refreshing of session, inventory, storage and so on are obviously much faster too.

Can't speak of the other improvements as for various reasons I am playing on a 10-year old downgraded computer that's first to get the blame for any slowdown, so if others say those are better - I believe them. ;)
Thanks!
 

slyz

Developer
for various reasons I am playing on a 10-year old downgraded computer that's first to get the blame for any slowdown
I am playing on a laptop that is beginning the end of its life (a 6 year old Dell Latitude), and I feel that Mafia is noticeably faster when everything is well.

However, these days I do a lot of auto-adventuring and Mafia frequently starts freezing after each adventure. The difference with the slowdowns I used to get is that, now, the Mafia windows (the main GUI window and the chat window) freeze completely. I can't even chat.

Apart from looking at my CPU usage spiking after each adventure, I'm not sure what I can do to figure out what is causing the freezes. I'll trying switching back to Java 6.

Like Ensiferum, I blame my computer. And I can always start using the Relay Browser chat if I need to communicate while I'm auto-adventuring :)
 

Ensiferum

Member
the Mafia windows (the main GUI window and the chat window) freeze completely. I can't even chat.
I've been getting that for months, several times daily - I have just assumed it's running out of memory, because 512 MB is... just not enough. :rolleyes:
 

livercat

Member
I'm seeing this behavior (GUI freezing for 2-5 seconds) at work, with ~300 MB of memory available to Java.
At home, with 6 GB of RAM, I haven't noticed this, and also assumed it is a memory problem.
 

slyz

Developer
When I run Mafia via Eclipse's "debug", I see freezes when doing intensive things like filtering my (large) inventory. However, none of the threads in the Debug panel becomes red.

I'm not 100% sure I'm doing this right, but I think that means it's my computer's fault.

I tried to run Java with more heap memory, and I was still getting small freezes while auto-adventuring.

I got this thread dump from VisualVM during a hang-up, although I have no idea whether it is useful. At least, it didn't seem useful to my untrained eye.
Code:
2013-10-01 23:02:45
Full thread dump Java HotSpot(TM) Client VM (23.7-b01 mixed mode, sharing):

"Keep-Alive-Timer" daemon prio=8 tid=0x0c11d400 nid=0x134 waiting on condition [0x0bc7f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at sun.net.www.http.KeepAliveCache.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"RMI TCP Connection(5)-192.168.0.1" daemon prio=6 tid=0x0c135000 nid=0xff0 runnable [0x0d42f000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    - locked <0x1b362158> (a java.io.BufferedInputStream)
    at java.io.FilterInputStream.read(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - <0x1b362358> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"Image Animator 3" daemon prio=4 tid=0x0c11c400 nid=0xd64 waiting on condition [0x0d10f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at sun.awt.image.GifFrame.dispose(Unknown Source)
    at sun.awt.image.GifImageDecoder.readImage(Unknown Source)
    at sun.awt.image.GifImageDecoder.produceImage(Unknown Source)
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at sun.awt.image.ImageFetcher.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent22" prio=6 tid=0x038a5c00 nid=0xfa4 in Object.wait() [0x0d3df000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b362528> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b362528> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent21" prio=6 tid=0x038a4c00 nid=0xc18 in Object.wait() [0x0d38f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b3625c8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b3625c8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent20" prio=6 tid=0x0c1cc400 nid=0xfc8 in Object.wait() [0x0d33f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b362668> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b362668> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent19" prio=6 tid=0x0c0ea800 nid=0x70 in Object.wait() [0x0d2ef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b362708> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b362708> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent18" prio=6 tid=0x0c0ea400 nid=0xf60 in Object.wait() [0x0d29f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b3627a8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b3627a8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent17" prio=6 tid=0x038a1800 nid=0x4dc in Object.wait() [0x0d24f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b362848> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b362848> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent16" prio=6 tid=0x03813c00 nid=0xab8 in Object.wait() [0x0d1ff000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b3628e8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b3628e8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent15" prio=6 tid=0x03814400 nid=0xc88 in Object.wait() [0x0d1af000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b362988> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b362988> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent14" prio=6 tid=0x03811000 nid=0x918 in Object.wait() [0x0d15f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1b362a28> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1b362a28> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent13" prio=6 tid=0x037e3800 nid=0x4e8 in Object.wait() [0x0d0bf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d218> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d218> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent12" prio=6 tid=0x037e2400 nid=0x174 in Object.wait() [0x0d06f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d2b8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d2b8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent11" prio=6 tid=0x037e1400 nid=0x2c0 in Object.wait() [0x0d01f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d358> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d358> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent10" prio=6 tid=0x037e0000 nid=0x31c in Object.wait() [0x0cfcf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d3f8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d3f8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent9" prio=6 tid=0x037df000 nid=0x88c in Object.wait() [0x0cf7f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d498> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d498> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent8" prio=6 tid=0x0375d800 nid=0x890 in Object.wait() [0x0cf2f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d538> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d538> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent7" prio=6 tid=0x0375cc00 nid=0xee8 in Object.wait() [0x0cedf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d5d8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d5d8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent6" prio=6 tid=0x037e5400 nid=0xcf4 in Object.wait() [0x0ce8f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d678> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d678> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent5" prio=6 tid=0x037e4400 nid=0xf40 in Object.wait() [0x0ce3f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d718> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d718> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent4" prio=6 tid=0x036f3800 nid=0xc8c in Object.wait() [0x0cdef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d7b8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d7b8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent3" prio=6 tid=0x03759400 nid=0xeb8 in Object.wait() [0x0cd9f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d858> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d858> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent2" prio=6 tid=0x036f0000 nid=0xfc4 in Object.wait() [0x0cd4f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d8f8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d8f8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent1" prio=6 tid=0x036ef800 nid=0xe30 in Object.wait() [0x0ccaf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a1d998> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a1d998> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayAgent0" prio=6 tid=0x038f4c00 nid=0xf6c in Object.wait() [0x0bf1f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x20a69dc8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x20a69dc8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAgent.run(RelayAgent.java:125)

   Locked ownable synchronizers:
    - None

"LocalRelayServer" prio=6 tid=0x038f5c00 nid=0xc04 runnable [0x0ccff000]
   java.lang.Thread.State: RUNNABLE
    at java.net.TwoStacksPlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(Unknown Source)
    at java.net.PlainSocketImpl.accept(Unknown Source)
    - locked <0x20a1db78> (a java.net.SocksSocketImpl)
    at java.net.ServerSocket.implAccept(Unknown Source)
    at java.net.ServerSocket.accept(Unknown Source)
    at net.sourceforge.kolmafia.webui.RelayServer.run(RelayServer.java:128)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"DestroyJavaVM" prio=6 tid=0x003b8c00 nid=0x1ec waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"Thread-162" prio=6 tid=0x0c122800 nid=0xa04 in Object.wait() [0x0cc5f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1fa54630> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:90)
    - locked <0x1fa54630> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.chat.ChatPoller.run(ChatPoller.java:98)

   Locked ownable synchronizers:
    - None

"CommandQueueHandler" prio=6 tid=0x038b5000 nid=0xe88 waiting for monitor entry [0x0c09e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.awt.Component.setFont(Unknown Source)
    - waiting to lock <0x1e1af480> (a java.awt.Component$AWTTreeLock)
    at java.awt.Container.setFont(Unknown Source)
    at javax.swing.JComponent.setFont(Unknown Source)
    at javax.swing.DefaultListCellRenderer.getListCellRendererComponent(Unknown Source)
    at net.sourceforge.kolmafia.swingui.widget.ListCellRendererFactory$UsableEquipmentRenderer.getListCellRendererComponent(ListCellRendererFactory.java:808)
    at net.sourceforge.kolmafia.swingui.widget.ListCellRendererFactory$FamiliarEquipmentRenderer.getListCellRendererComponent(ListCellRendererFactory.java:841)
    at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI$Handler.valueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.removeIndexInterval(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(Unknown Source)
    at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source)
    at net.java.dev.spellcast.utilities.LockableListModel.fireIntervalRemoved(LockableListModel.java:210)
    at net.java.dev.spellcast.utilities.LockableListModel.removeVisibleElement(LockableListModel.java:599)
    at net.java.dev.spellcast.utilities.LockableListModel.remove(LockableListModel.java:572)
    - locked <0x1e7e7490> (a java.util.ArrayList)
    at net.java.dev.spellcast.utilities.LockableListModel$ListModelIterator.remove(LockableListModel.java:490)
    at net.java.dev.spellcast.utilities.LockableListModel.retainAll(LockableListModel.java:655)
    - locked <0x1e7e7490> (a java.util.ArrayList)
    at net.sourceforge.kolmafia.session.EquipmentManager.updateEquipmentList(EquipmentManager.java:1215)
    at net.sourceforge.kolmafia.session.EquipmentManager.updateEquipmentList(EquipmentManager.java:1121)
    at net.sourceforge.kolmafia.KoLCharacter.setFamiliar(KoLCharacter.java:4103)
    at net.sourceforge.kolmafia.request.CharPaneRequest.parseStatus(CharPaneRequest.java:1146)
    at net.sourceforge.kolmafia.request.ApiRequest.parseStatus(ApiRequest.java:360)
    at net.sourceforge.kolmafia.request.ApiRequest.parseStatus(ApiRequest.java:325)
    at net.sourceforge.kolmafia.request.ApiRequest.parseResponse(ApiRequest.java:163)
    at net.sourceforge.kolmafia.request.GenericRequest.processResponse(GenericRequest.java:2197)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:2152)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:1810)
    at net.sourceforge.kolmafia.request.GenericRequest.execute(GenericRequest.java:1482)
    at net.sourceforge.kolmafia.request.GenericRequest.run(GenericRequest.java:1375)
    at net.sourceforge.kolmafia.request.ApiRequest.run(ApiRequest.java:132)
    at net.sourceforge.kolmafia.request.ApiRequest.updateStatus(ApiRequest.java:97)
    - locked <0x1e2153c8> (a java.lang.Class for net.sourceforge.kolmafia.request.ApiRequest)
    at net.sourceforge.kolmafia.request.GenericRequest.processResponse(GenericRequest.java:2295)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:2152)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:1810)
    at net.sourceforge.kolmafia.request.GenericRequest.execute(GenericRequest.java:1482)
    at net.sourceforge.kolmafia.request.GenericRequest.run(GenericRequest.java:1375)
    at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:222)
    at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:185)
    at net.sourceforge.kolmafia.textui.RuntimeLibrary.visit_url(RuntimeLibrary.java:1948)
    at net.sourceforge.kolmafia.textui.RuntimeLibrary.visit_url(RuntimeLibrary.java:1899)
    at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.sourceforge.kolmafia.textui.parsetree.LibraryFunction.execute(LibraryFunction.java:106)
    at net.sourceforge.kolmafia.textui.parsetree.FunctionCall.execute(FunctionCall.java:154)
    at net.sourceforge.kolmafia.textui.parsetree.Variable.getValue(Variable.java:88)
    at net.sourceforge.kolmafia.textui.parsetree.VariableReference.execute(VariableReference.java:85)
    at net.sourceforge.kolmafia.textui.parsetree.FunctionCall.execute(FunctionCall.java:105)
    at net.sourceforge.kolmafia.textui.parsetree.Conditional.execute(Conditional.java:80)
    at net.sourceforge.kolmafia.textui.parsetree.If.execute(If.java:68)
    at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:465)
    at net.sourceforge.kolmafia.textui.parsetree.Loop.execute(Loop.java:59)
    at net.sourceforge.kolmafia.textui.parsetree.WhileLoop.execute(WhileLoop.java:100)
    at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:465)
    at net.sourceforge.kolmafia.textui.parsetree.UserDefinedFunction.execute(UserDefinedFunction.java:152)
    at net.sourceforge.kolmafia.textui.parsetree.FunctionCall.execute(FunctionCall.java:154)
    at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:465)
    at net.sourceforge.kolmafia.textui.Interpreter.executeScope(Interpreter.java:351)
    at net.sourceforge.kolmafia.textui.Interpreter.execute(Interpreter.java:299)
    at net.sourceforge.kolmafia.textui.Interpreter.execute(Interpreter.java:292)
    at net.sourceforge.kolmafia.textui.command.CallScriptCommand.call(CallScriptCommand.java:251)
    at net.sourceforge.kolmafia.textui.command.CallScriptCommand.run(CallScriptCommand.java:75)
    at net.sourceforge.kolmafia.KoLmafiaCLI.doExecuteCommand(KoLmafiaCLI.java:595)
    at net.sourceforge.kolmafia.KoLmafiaCLI.executeCommand(KoLmafiaCLI.java:548)
    at net.sourceforge.kolmafia.KoLmafiaCLI.executeLine(KoLmafiaCLI.java:449)
    at net.sourceforge.kolmafia.KoLmafiaCLI.executeLine(KoLmafiaCLI.java:317)
    at net.sourceforge.kolmafia.swingui.CommandDisplayFrame$CommandQueueHandler.handleQueue(CommandDisplayFrame.java:190)
    at net.sourceforge.kolmafia.swingui.CommandDisplayFrame$CommandQueueHandler.run(CommandDisplayFrame.java:164)

   Locked ownable synchronizers:
    - None

"Thread-6" daemon prio=6 tid=0x0390e000 nid=0x5b8 in Object.wait() [0x0bfaf000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1f2544d8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:90)
    - locked <0x1f2544d8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.KoLDesktop$MemoryUsageMonitor.run(KoLDesktop.java:471)

   Locked ownable synchronizers:
    - None

"JMX server connection timeout 27" daemon prio=6 tid=0x037a8c00 nid=0x1c4 in Object.wait() [0x0bebf000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1e1731c8> (a [I)
    at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(Unknown Source)
    - locked <0x1e1731c8> (a [I)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"RMI Scheduler(0)" daemon prio=6 tid=0x037a2c00 nid=0xdbc waiting on condition [0x0be6f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x1e173258> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"RMI TCP Connection(idle)" daemon prio=6 tid=0x0379a400 nid=0x42c waiting on condition [0x0be1f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x1e7d7498> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(Unknown Source)
    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(Unknown Source)
    at java.util.concurrent.SynchronousQueue.poll(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"RMI TCP Accept-0" daemon prio=6 tid=0x0370c400 nid=0x300 runnable [0x0bdcf000]
   java.lang.Thread.State: RUNNABLE
    at java.net.TwoStacksPlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(Unknown Source)
    at java.net.PlainSocketImpl.accept(Unknown Source)
    - locked <0x1e1756b0> (a java.net.SocksSocketImpl)
    at java.net.ServerSocket.implAccept(Unknown Source)
    at java.net.ServerSocket.accept(Unknown Source)
    at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"LocalRelayCombatThread" daemon prio=6 tid=0x03573400 nid=0xb10 in Object.wait() [0x0bacf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1e1757c8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at java.lang.Object.wait(Object.java:503)
    at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:57)
    - locked <0x1e1757c8> (a net.sourceforge.kolmafia.utilities.PauseObject)
    at net.sourceforge.kolmafia.webui.RelayAutoCombatThread.run(RelayAutoCombatThread.java:70)

   Locked ownable synchronizers:
    - None

"TimerQueue" daemon prio=6 tid=0x03562400 nid=0xed8 waiting on condition [0x039cf000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x1e175840> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
    at java.util.concurrent.DelayQueue.take(Unknown Source)
    at javax.swing.TimerQueue.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - <0x1e7d7788> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

"AWT-EventQueue-0" prio=6 tid=0x0332c400 nid=0x8e8 runnable [0x0396e000]
   java.lang.Thread.State: RUNNABLE
    at java.text.RuleBasedBreakIterator.getCurrentCodePointCount(Unknown Source)
    at java.text.RuleBasedBreakIterator.getNext(Unknown Source)
    at java.text.RuleBasedBreakIterator.handleNext(Unknown Source)
    at java.text.RuleBasedBreakIterator.previous(Unknown Source)
    at java.text.RuleBasedBreakIterator.preceding(Unknown Source)
    at javax.swing.text.GlyphView.getBreakSpot(Unknown Source)
    at javax.swing.text.GlyphView.getBreakWeight(Unknown Source)
    at javax.swing.text.html.InlineView.getBreakWeight(Unknown Source)
    at javax.swing.text.FlowView$LogicalView.getPreferredSpan(Unknown Source)
    at javax.swing.text.FlowView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.BoxView.checkRequests(Unknown Source)
    at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
    at javax.swing.text.html.ParagraphView.getMinimumSpan(Unknown Source)
    at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.BoxView.checkRequests(Unknown Source)
    at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
    at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
    at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.BoxView.checkRequests(Unknown Source)
    at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
    at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
    at javax.swing.plaf.basic.BasicTextUI$RootView.getMinimumSpan(Unknown Source)
    at javax.swing.plaf.basic.BasicTextUI.getMinimumSize(Unknown Source)
    at javax.swing.JEditorPane.getScrollableTracksViewportWidth(Unknown Source)
    at javax.swing.JEditorPane.getPreferredSize(Unknown Source)
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    - locked <0x1e1af480> (a java.awt.Component$AWTTreeLock)
    at javax.swing.RepaintManager$2.run(Unknown Source)
    at javax.swing.RepaintManager$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"AWT-Shutdown" prio=6 tid=0x0330a400 nid=0xcdc in Object.wait() [0x0337f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1e175a30> (a java.lang.Object)
    at java.lang.Object.wait(Object.java:503)
    at sun.awt.AWTAutoShutdown.run(Unknown Source)
    - locked <0x1e175a30> (a java.lang.Object)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"AWT-Windows" daemon prio=6 tid=0x031fa800 nid=0xce4 runnable [0x033cf000]
   java.lang.Thread.State: RUNNABLE
    at sun.awt.windows.WToolkit.eventLoop(Native Method)
    at sun.awt.windows.WToolkit.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"Java2D Disposer" daemon prio=10 tid=0x031f6000 nid=0x858 in Object.wait() [0x030ef000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1e175b28> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    - locked <0x1e175b28> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at sun.java2d.Disposer.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"Service Thread" daemon prio=6 tid=0x02b9c800 nid=0x82c runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"C1 CompilerThread0" daemon prio=10 tid=0x02b96c00 nid=0x2e4 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"Attach Listener" daemon prio=10 tid=0x02b94c00 nid=0x8f8 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"Signal Dispatcher" daemon prio=10 tid=0x02b93800 nid=0x6ac runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
    - None

"Finalizer" daemon prio=8 tid=0x02b84800 nid=0xdc4 in Object.wait() [0x02f0f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1e175d58> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    - locked <0x1e175d58> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(Unknown Source)
    at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)

   Locked ownable synchronizers:
    - None

"Reference Handler" daemon prio=10 tid=0x02b7fc00 nid=0xf64 in Object.wait() [0x02ebf000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1e172f00> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:503)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x1e172f00> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
    - None

"VM Thread" prio=10 tid=0x02b7e000 nid=0x7f4 runnable 

"VM Periodic Task Thread" prio=10 tid=0x02baf400 nid=0x27c waiting on condition 

JNI global references: 1046
 

Veracity

Developer
Staff member
So, let's see.

You were running a script in the CLI.
The script did a visit_url()
The response to the request asked for a charpane refresh. Since it was not a relay request, we turn that into an api.php refresh.
We get back the response and want to update the equipment lists (which are visible in the Gear Changer).
We end up removing something from the familiar item list.
That results in firing an update on, presumably, the Gear Changer's list.
That thread blocks waiting on a swing lock; it is in state BLOCKED

Meanwhile, over in the swing event thread, it holds that swing lock
I see nothing to indicate that it is blocked; it is in state RUNNABLE.

In other words, this does not appear to be a deadlock.

So, when you say "freeze", is this a temporary thing - while it is filtering - or is it a hard lockup, which is what I thought you mentioned earlier?

For reference, here are the stack traces of the two threads I mentioned. I'm not necessarily done thinking about them...

Code:
"CommandQueueHandler" prio=6 tid=0x038b5000 nid=0xe88 waiting for monitor entry [0x0c09e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.awt.Component.setFont(Unknown Source)
    - waiting to lock <0x1e1af480> (a java.awt.Component$AWTTreeLock)
    at java.awt.Container.setFont(Unknown Source)
    at javax.swing.JComponent.setFont(Unknown Source)
    at javax.swing.DefaultListCellRenderer.getListCellRendererComponent(Unknown Source)
    at net.sourceforge.kolmafia.swingui.widget.ListCellRendererFactory$UsableEquipmentRenderer.getListCellRendererComponent(ListCellRendererFactory.java:808)
    at net.sourceforge.kolmafia.swingui.widget.ListCellRendererFactory$FamiliarEquipmentRenderer.getListCellRendererComponent(ListCellRendererFactory.java:841)
    at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI$Handler.valueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.removeIndexInterval(Unknown Source)
    at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(Unknown Source)
    at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source)
    at net.java.dev.spellcast.utilities.LockableListModel.fireIntervalRemoved(LockableListModel.java:210)
    at net.java.dev.spellcast.utilities.LockableListModel.removeVisibleElement(LockableListModel.java:599)
    at net.java.dev.spellcast.utilities.LockableListModel.remove(LockableListModel.java:572)
    - locked <0x1e7e7490> (a java.util.ArrayList)
    at net.java.dev.spellcast.utilities.LockableListModel$ListModelIterator.remove(LockableListModel.java:490)
    at net.java.dev.spellcast.utilities.LockableListModel.retainAll(LockableListModel.java:655)
    - locked <0x1e7e7490> (a java.util.ArrayList)
    at net.sourceforge.kolmafia.session.EquipmentManager.updateEquipmentList(EquipmentManager.java:1215)
    at net.sourceforge.kolmafia.session.EquipmentManager.updateEquipmentList(EquipmentManager.java:1121)
    at net.sourceforge.kolmafia.KoLCharacter.setFamiliar(KoLCharacter.java:4103)
    at net.sourceforge.kolmafia.request.CharPaneRequest.parseStatus(CharPaneRequest.java:1146)
    at net.sourceforge.kolmafia.request.ApiRequest.parseStatus(ApiRequest.java:360)
    at net.sourceforge.kolmafia.request.ApiRequest.parseStatus(ApiRequest.java:325)
    at net.sourceforge.kolmafia.request.ApiRequest.parseResponse(ApiRequest.java:163)
    at net.sourceforge.kolmafia.request.GenericRequest.processResponse(GenericRequest.java:2197)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:2152)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:1810)
    at net.sourceforge.kolmafia.request.GenericRequest.execute(GenericRequest.java:1482)
    at net.sourceforge.kolmafia.request.GenericRequest.run(GenericRequest.java:1375)
    at net.sourceforge.kolmafia.request.ApiRequest.run(ApiRequest.java:132)
    at net.sourceforge.kolmafia.request.ApiRequest.updateStatus(ApiRequest.java:97)
    - locked <0x1e2153c8> (a java.lang.Class for net.sourceforge.kolmafia.request.ApiRequest)
    at net.sourceforge.kolmafia.request.GenericRequest.processResponse(GenericRequest.java:2295)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:2152)
    at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:1810)
    at net.sourceforge.kolmafia.request.GenericRequest.execute(GenericRequest.java:1482)
    at net.sourceforge.kolmafia.request.GenericRequest.run(GenericRequest.java:1375)
    at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:222)
    at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:185)
    at net.sourceforge.kolmafia.textui.RuntimeLibrary.visit_url(RuntimeLibrary.java:1948)
    at net.sourceforge.kolmafia.textui.RuntimeLibrary.visit_url(RuntimeLibrary.java:1899)
    at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.sourceforge.kolmafia.textui.parsetree.LibraryFunction.execute(LibraryFunction.java:106)
    at net.sourceforge.kolmafia.textui.parsetree.FunctionCall.execute(FunctionCall.java:154)
    at net.sourceforge.kolmafia.textui.parsetree.Variable.getValue(Variable.java:88)
    at net.sourceforge.kolmafia.textui.parsetree.VariableReference.execute(VariableReference.java:85)
    at net.sourceforge.kolmafia.textui.parsetree.FunctionCall.execute(FunctionCall.java:105)
    at net.sourceforge.kolmafia.textui.parsetree.Conditional.execute(Conditional.java:80)
    at net.sourceforge.kolmafia.textui.parsetree.If.execute(If.java:68)
    at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:465)
    at net.sourceforge.kolmafia.textui.parsetree.Loop.execute(Loop.java:59)
    at net.sourceforge.kolmafia.textui.parsetree.WhileLoop.execute(WhileLoop.java:100)
    at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:465)
    at net.sourceforge.kolmafia.textui.parsetree.UserDefinedFunction.execute(UserDefinedFunction.java:152)
    at net.sourceforge.kolmafia.textui.parsetree.FunctionCall.execute(FunctionCall.java:154)
    at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:465)
    at net.sourceforge.kolmafia.textui.Interpreter.executeScope(Interpreter.java:351)
    at net.sourceforge.kolmafia.textui.Interpreter.execute(Interpreter.java:299)
    at net.sourceforge.kolmafia.textui.Interpreter.execute(Interpreter.java:292)
    at net.sourceforge.kolmafia.textui.command.CallScriptCommand.call(CallScriptCommand.java:251)
    at net.sourceforge.kolmafia.textui.command.CallScriptCommand.run(CallScriptCommand.java:75)
    at net.sourceforge.kolmafia.KoLmafiaCLI.doExecuteCommand(KoLmafiaCLI.java:595)
    at net.sourceforge.kolmafia.KoLmafiaCLI.executeCommand(KoLmafiaCLI.java:548)
    at net.sourceforge.kolmafia.KoLmafiaCLI.executeLine(KoLmafiaCLI.java:449)
    at net.sourceforge.kolmafia.KoLmafiaCLI.executeLine(KoLmafiaCLI.java:317)
    at net.sourceforge.kolmafia.swingui.CommandDisplayFrame$CommandQueueHandler.handleQueue(CommandDisplayFrame.java:190)
    at net.sourceforge.kolmafia.swingui.CommandDisplayFrame$CommandQueueHandler.run(CommandDisplayFrame.java:164)

"AWT-EventQueue-0" prio=6 tid=0x0332c400 nid=0x8e8 runnable [0x0396e000]
   java.lang.Thread.State: RUNNABLE
    at java.text.RuleBasedBreakIterator.getCurrentCodePointCount(Unknown Source)
    at java.text.RuleBasedBreakIterator.getNext(Unknown Source)
    at java.text.RuleBasedBreakIterator.handleNext(Unknown Source)
    at java.text.RuleBasedBreakIterator.previous(Unknown Source)
    at java.text.RuleBasedBreakIterator.preceding(Unknown Source)
    at javax.swing.text.GlyphView.getBreakSpot(Unknown Source)
    at javax.swing.text.GlyphView.getBreakWeight(Unknown Source)
    at javax.swing.text.html.InlineView.getBreakWeight(Unknown Source)
    at javax.swing.text.FlowView$LogicalView.getPreferredSpan(Unknown Source)
    at javax.swing.text.FlowView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.BoxView.checkRequests(Unknown Source)
    at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
    at javax.swing.text.html.ParagraphView.getMinimumSpan(Unknown Source)
    at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.BoxView.checkRequests(Unknown Source)
    at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
    at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
    at javax.swing.text.BoxView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(Unknown Source)
    at javax.swing.text.BoxView.checkRequests(Unknown Source)
    at javax.swing.text.BoxView.getMinimumSpan(Unknown Source)
    at javax.swing.text.html.BlockView.getMinimumSpan(Unknown Source)
    at javax.swing.plaf.basic.BasicTextUI$RootView.getMinimumSpan(Unknown Source)
    at javax.swing.plaf.basic.BasicTextUI.getMinimumSize(Unknown Source)
    at javax.swing.JEditorPane.getScrollableTracksViewportWidth(Unknown Source)
    at javax.swing.JEditorPane.getPreferredSize(Unknown Source)
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    - locked <0x1e1af480> (a java.awt.Component$AWTTreeLock)
    at javax.swing.RepaintManager$2.run(Unknown Source)
    at javax.swing.RepaintManager$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
 
Top