Bug - Waiting for Info On OS X 10.7.2, closing mafia with ⌘Q doesn't show login frame before quitting

Rinn

Developer
I'm running revision 10522, and I just noticed that closing mafia through the menu strip or with ⌘Q just closed the application instantly without showing the login frame. Closing it via the titlebar x button seems to work correctly. I am able to reproduce this 100% of the time. I was unable to reproduce this on my work pc running Windows 7.

No debug log was created, and I don't have a debugger installed on my mac at the moment so I can't really provide any more information.

Edit: As of 10508 the logout script wasn't being run, that has since been fixed. The login frame is still failing to appear with 10522.
 
Last edited:

Veracity

Developer
Staff member
CreateFrameRunnable does this:
Code:
			// In the case of OSX, we'll also need a shutdown hook

			boolean isUsingMac = System.getProperty( "os.name" ).startsWith( "Mac" );
			if ( isUsingMac )
			{
				CreateFrameRunnable.addOSXMenuItems();
			}
addOSXMenuItems() does:
Code:
			OSXAdapter.setQuitHandler( KoLmafia.class,
						   KoLmafia.class.getDeclaredMethod( "quitThreaded", (Class[]) null ) );
KoLmafia.quitThreaded() does:
Code:
		RequestThread.runInParallel( new QuitRunnable() );
QuitRunnable does:
Code:
			KoLmafia.quit();
and, finally, KoLmafia.quit() does:
Code:
		LogoutManager.logout();
		System.exit( 0 );
Perhaps quitThreaded() needs to pause or something and let the actual logout thread run and do the exit.
 
Last edited:

holatuwol

Developer
I get the feeling that a quit handler might be the same as a shut down hook, so I just made the call to quit not threaded. I'm not close to my Mac for another couple days, can you let us know if this worked?
 

Veracity

Developer
Staff member
Code:
Runnable in event dispatch thread
class java.lang.Exception: Runnable in event dispatch thread
java.lang.Exception: Runnable in event dispatch thread
	at net.sourceforge.kolmafia.StaticEntity.printStackTrace(StaticEntity.java:380)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:216)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:182)
	at net.sourceforge.kolmafia.session.LogoutManager.logout(LogoutManager.java:122)
	at net.sourceforge.kolmafia.KoLmafia.quit(KoLmafia.java:2344)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at apple.dts.samplecode.osxadapter.OSXAdapter.callTarget(OSXAdapter.java:167)
	at apple.dts.samplecode.osxadapter.OSXAdapter.invoke(OSXAdapter.java:178)
	at $Proxy0.handleQuit(Unknown Source)
	at com.apple.eawt._AppEventLegacyHandler$7.dispatchEvent(_AppEventLegacyHandler.java:146)
	at com.apple.eawt._AppEventLegacyHandler.sendEventToEachListenerUntilHandled(_AppEventLegacyHandler.java:168)
	at com.apple.eawt._AppEventLegacyHandler.handleQuitRequestWith(_AppEventLegacyHandler.java:144)
	at com.apple.eawt._AppEventHandler$_QuitDispatcher.performUsing(_AppEventHandler.java:387)
	at com.apple.eawt._AppEventHandler$_QuitDispatcher.performUsing(_AppEventHandler.java:380)
	at com.apple.eawt._AppEventHandler$_AppEventDispatcher$1.run(_AppEventHandler.java:489)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:677)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:647)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Runnable in event dispatch thread

This was the problem that quitThreaded was intended to solve. Apparently, it didn't work. You reverted, and now we are back to the stack trace.

I am experimenting.
 

Veracity

Developer
Staff member
I did this:

set logoutScript=ashq print( "Goodbye!" )

With your change (reversion), I hit command-Q, which invoked the Quit menu item. LogoutManager made the Login Frame (I assume; it was the right size and was centered in my screen, but it was completely blank) visible. No status messages were displayed in the blank frame. When it came to my logout script, I got this stack trace:

Code:
Pause object in event dispatch thread
class java.lang.Exception: Pause object in event dispatch thread
java.lang.Exception: Pause object in event dispatch thread
	at net.sourceforge.kolmafia.StaticEntity.printStackTrace(StaticEntity.java:380)
	at net.sourceforge.kolmafia.utilities.PauseObject.pause(PauseObject.java:78)
	at net.sourceforge.kolmafia.textui.parsetree.BasicScope.execute(BasicScope.java:444)
	at net.sourceforge.kolmafia.textui.Interpreter.executeScope(Interpreter.java:335)
	at net.sourceforge.kolmafia.textui.Interpreter.execute(Interpreter.java:283)
	at net.sourceforge.kolmafia.textui.Interpreter.execute(Interpreter.java:276)
	at net.sourceforge.kolmafia.textui.command.AshSingleLineCommand.run(AshSingleLineCommand.java:67)
	at net.sourceforge.kolmafia.KoLmafiaCLI.doExecuteCommand(KoLmafiaCLI.java:535)
	at net.sourceforge.kolmafia.KoLmafiaCLI.executeCommand(KoLmafiaCLI.java:489)
	at net.sourceforge.kolmafia.KoLmafiaCLI.executeLine(KoLmafiaCLI.java:395)
	at net.sourceforge.kolmafia.session.LogoutManager.logout(LogoutManager.java:103)
	at net.sourceforge.kolmafia.KoLmafia.quit(KoLmafia.java:2343)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at apple.dts.samplecode.osxadapter.OSXAdapter.callTarget(OSXAdapter.java:167)
	at apple.dts.samplecode.osxadapter.OSXAdapter.invoke(OSXAdapter.java:178)
	at $Proxy0.handleQuit(Unknown Source)
	at com.apple.eawt._AppEventLegacyHandler$7.dispatchEvent(_AppEventLegacyHandler.java:146)
	at com.apple.eawt._AppEventLegacyHandler.sendEventToEachListenerUntilHandled(_AppEventLegacyHandler.java:168)
	at com.apple.eawt._AppEventLegacyHandler.handleQuitRequestWith(_AppEventLegacyHandler.java:144)
	at com.apple.eawt._AppEventHandler$_QuitDispatcher.performUsing(_AppEventHandler.java:387)
	at com.apple.eawt._AppEventHandler$_QuitDispatcher.performUsing(_AppEventHandler.java:380)
	at com.apple.eawt._AppEventHandler$_AppEventDispatcher$1.run(_AppEventHandler.java:489)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:677)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:647)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Pause object in event dispatch thread

And then, when LogoutManager actually submitted the LogoutRequest, I got the stack trace I gave above:

Code:
Runnable in event dispatch thread
class java.lang.Exception: Runnable in event dispatch thread
java.lang.Exception: Runnable in event dispatch thread
	at net.sourceforge.kolmafia.StaticEntity.printStackTrace(StaticEntity.java:380)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:216)
	at net.sourceforge.kolmafia.RequestThread.postRequest(RequestThread.java:182)
	at net.sourceforge.kolmafia.session.LogoutManager.logout(LogoutManager.java:122)
	at net.sourceforge.kolmafia.KoLmafia.quit(KoLmafia.java:2343)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at apple.dts.samplecode.osxadapter.OSXAdapter.callTarget(OSXAdapter.java:167)
	at apple.dts.samplecode.osxadapter.OSXAdapter.invoke(OSXAdapter.java:178)
	at $Proxy0.handleQuit(Unknown Source)
	at com.apple.eawt._AppEventLegacyHandler$7.dispatchEvent(_AppEventLegacyHandler.java:146)
	at com.apple.eawt._AppEventLegacyHandler.sendEventToEachListenerUntilHandled(_AppEventLegacyHandler.java:168)
	at com.apple.eawt._AppEventLegacyHandler.handleQuitRequestWith(_AppEventLegacyHandler.java:144)
	at com.apple.eawt._AppEventHandler$_QuitDispatcher.performUsing(_AppEventHandler.java:387)
	at com.apple.eawt._AppEventHandler$_QuitDispatcher.performUsing(_AppEventHandler.java:380)
	at com.apple.eawt._AppEventHandler$_AppEventDispatcher$1.run(_AppEventHandler.java:489)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:677)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:647)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Runnable in event dispatch thread

I find this unsatisfying, but I throw up my hands and will leave it to you to look at eventually.
 

Rinn

Developer
Hm, the changes you made didn't seem to make a difference, it still closes instantly. I'll look at this when I get home since it's affecting my os and I should be able to test it easier or figure out if there's something else going on.
 

holatuwol

Developer
To verify, when you say it closes instantly, do you mean a UI issue where all the windows are gone but your logout script still runs, or do you that mean that when you go back and check your session logs you find that your logout script hasn't run at all?
 

Rinn

Developer
Oh yeah, you're right my mistake. The logout script is still being run there's just no indication of anything occuring, then the login frame doesn't appear. I just checked against 10522, the logout script ran but still no login frame, it also looked like the application was unresponsive while the logout script was processing.

Edit: I went back to 10508 and that definitely wasn't running the logout script, so your changes at least got that working. I updated this thread title and my first post accordingly.
 
Last edited:

holatuwol

Developer
It's possible to get ⌘Q to at least show the login window, but because of how ⌘Q is implemented by Apple, KoLmafia won't be able to update the display while the logout script executes. That being said, because we're purposefully blocking the event dispatch thread to prevent the shutdown from completing, I'm not sure if I've introduced any other weird deadlock issues related to shutdown that might now only surface when using ⌘Q on OSX.
 
Top