Bug - Fixed Debug log when swapping characters

Darzil

Developer
I've had this for ages, when swapping from Darzil to an alt, Astilbe. Don't often play her, but when I swap to her I always get this session initialisation error. Never have been able to isolate exact cause (doesn't happen if I run in Eclipse to debug).

View attachment DEBUG_20160922.txt

Any ideas ?
 

Veracity

Developer
Staff member
I tried to reproduce this.

I logged into character A
I closed the main frame and was sent back to the LoginFrame
I logged into character B
No problem

Now, what I did was to make ListenerRegistry synchronize on this.deferredList both when adding and when iterating. Note that synchronize only excludes other threads from accessing the variable. If the same thread tries to touch it, it will be allowed.

I'll look into making it give a stack trace when adding if it gets into the synchronization block while adding while we are firing listeners. Hopefully, that will let us see better what is going on.
 

Darzil

Developer
Yeah, there is something funky, given it doesn't happen on my second alt, or swapping between them, or in Eclipse. So a bit of a race somewhere I suspect.
 

Veracity

Developer
Staff member
Excellent.

Code:
Deferring listeners while firing deferred listeners
class java.lang.Exception: Deferring listeners while firing deferred listeners
java.lang.Exception: Deferring listeners while firing deferred listeners
	at net.sourceforge.kolmafia.StaticEntity.printStackTrace(StaticEntity.java:387)
	at net.sourceforge.kolmafia.listener.ListenerRegistry.fireListener(ListenerRegistry.java:173)
	at net.sourceforge.kolmafia.listener.PreferenceListenerRegistry.firePreferenceChanged(PreferenceListenerRegistry.java:54)
	at net.sourceforge.kolmafia.KoLCharacter.setStillsAvailable(KoLCharacter.java:4760)
	at net.sourceforge.kolmafia.request.StillRequest.parseResponse(StillRequest.java:92)
	at net.sourceforge.kolmafia.request.NPCPurchaseRequest.parseShopResponse(NPCPurchaseRequest.java:523)
	at net.sourceforge.kolmafia.session.ResponseTextParser.externalUpdate(ResponseTextParser.java:725)
	at net.sourceforge.kolmafia.request.GenericRequest.processResults(GenericRequest.java:2781)
	at net.sourceforge.kolmafia.request.GenericRequest.processResponse(GenericRequest.java:2498)
	at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:2384)
	at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:1998)
	at net.sourceforge.kolmafia.request.GenericRequest.externalExecute(GenericRequest.java:1565)
	at net.sourceforge.kolmafia.request.GenericRequest.execute(GenericRequest.java:1548)
	at net.sourceforge.kolmafia.request.GenericRequest.run(GenericRequest.java:1310)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:286)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:249)
	at net.sourceforge.kolmafia.KoLCharacter.getStillsAvailable(KoLCharacter.java:4742)
	at net.sourceforge.kolmafia.swingui.panel.DailyDeedsPanel$StillsDaily.update(DailyDeedsPanel.java:3101)
	at net.sourceforge.kolmafia.listener.ListenerRegistry.fireListeners(ListenerRegistry.java:285)
	at net.sourceforge.kolmafia.listener.ListenerRegistry.deferListeners(ListenerRegistry.java:110)
	at net.sourceforge.kolmafia.listener.PreferenceListenerRegistry.deferPreferenceListeners(PreferenceListenerRegistry.java:44)
	at net.sourceforge.kolmafia.KoLmafia.setIsRefreshing(KoLmafia.java:969)
	at net.sourceforge.kolmafia.KoLmafia.refreshSession(KoLmafia.java:785)
	at net.sourceforge.kolmafia.session.LoginManager.initialize(LoginManager.java:212)
	at net.sourceforge.kolmafia.session.LoginManager.doLogin(LoginManager.java:96)
	at net.sourceforge.kolmafia.session.LoginManager.login(LoginManager.java:80)
	at net.sourceforge.kolmafia.request.LoginRequest.processLoginRequest(LoginRequest.java:409)
	at net.sourceforge.kolmafia.request.GenericRequest.handleServerRedirect(GenericRequest.java:2129)
	at net.sourceforge.kolmafia.request.GenericRequest.retrieveServerReply(GenericRequest.java:2008)
	at net.sourceforge.kolmafia.request.GenericRequest.externalExecute(GenericRequest.java:1565)
	at net.sourceforge.kolmafia.request.GenericRequest.execute(GenericRequest.java:1548)
	at net.sourceforge.kolmafia.request.GenericRequest.run(GenericRequest.java:1310)
	at net.sourceforge.kolmafia.request.LoginRequest.run(LoginRequest.java:270)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:286)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:249)
	at net.sourceforge.kolmafia.swingui.LoginFrame$LoginPanel.doLogin(LoginFrame.java:344)
	at net.sourceforge.kolmafia.swingui.LoginFrame$LoginPanel.actionConfirmed(LoginFrame.java:300)
	at net.sourceforge.kolmafia.swingui.panel.GenericPanel$ConfirmedListener.execute(GenericPanel.java:627)
	at net.sourceforge.kolmafia.swingui.listener.ThreadedListener.run(ThreadedListener.java:239)
	at net.sourceforge.kolmafia.RequestThread$SequencedRunnable.run(RequestThread.java:418)
	at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
	at java.util.concurrent.FutureTask.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)
Deferring listeners while firing deferred listeners
Inside the post-login thread, it fired the StillsDaily Daily Deed.
That submitted a request to look at the Still in the guild.
The response comes back:
- defer preference listeners
- process response
- KoLCharacter.setStillAvailable
-- tries to fire a "(stills)" change
And since listeners are deferred, here we are: trying to change the deferred listeners list while we are processing listeners

I'll have to think about this.
 
Top