Problemas ao rodar app java em mac os 10.6.x com jvm cocoa 64-bits : NSConditionLock?

3 respostas
faelcavalcanti

Gente, tou iniciando com mac agora 10.6.x, usando jdk 1.6.0_20. Quando tento rodar uma app aqui joga este log e visualmente não aparece nada:

2010-06-24 16:54:10.267 java[1805:903] [Java CocoaComponent compatibility mode]: Enabled
2010-06-24 16:54:10.273 java[1805:903] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2010-06-24 16:54:10.972 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100135590> ‘(null)’) unlocked when not locked
2010-06-24 16:54:10.973 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:10.975 java[1805:d603] *** __NSAutoreleaseNoPool(): Object 0x10062d4a0 of class NSCFNumber autoreleased with no pool in place - just leaking
2010-06-24 16:54:11.076 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100650a10> ‘(null)’) unlocked when not locked
2010-06-24 16:54:11.077 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:11.194 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x10065b0a0> ‘(null)’) unlocked when not locked
2010-06-24 16:54:11.196 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:11.299 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x10065e820> ‘(null)’) unlocked when not locked
2010-06-24 16:54:11.303 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:11.949 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100654f40> ‘(null)’) unlocked when not locked
2010-06-24 16:54:11.951 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:12.056 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006b7740> ‘(null)’) unlocked when not locked
2010-06-24 16:54:12.056 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:12.771 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100620410> ‘(null)’) unlocked when not locked
2010-06-24 16:54:12.772 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:12.873 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100181b80> ‘(null)’) unlocked when not locked
2010-06-24 16:54:12.874 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:12.978 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x10013cc00> ‘(null)’) unlocked when not locked
2010-06-24 16:54:12.979 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:13.080 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100617840> ‘(null)’) unlocked when not locked
2010-06-24 16:54:13.082 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.259 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006197c0> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.260 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.361 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x100618e50> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.362 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.476 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006b96c0> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.477 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.578 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006b9970> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.579 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.681 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006b56e0> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.683 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.785 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006b5900> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.787 java[1805:d603] *** Break on _NSLockError() to debug.
2010-06-24 16:54:23.888 java[1805:d603] *** -[NSConditionLock unlock]: lock (<NSConditionLock: 0x1006b5b90> ‘(null)’) unlocked when not locked
2010-06-24 16:54:23.889 java[1805:d603] *** Break on _NSLockError() to debug.

também tentei utilizando opção usando [-XstartOnFirstThread], mas o problema persiste. estou utilizando a versao 3.6M7 do swt no projeto, em versao cocoa 64-bits por conta do jdk. alguém já passou por isso?

3 Respostas

faelcavalcanti
na prática utilizando um teste com componente fest para facilitar testes funcionais utilizando swing, ele dá o erro acima. segue abaixo código:
@Test public void testCompatibilityCocoaMac64Bits() throws IOException {
		JFrame frame = GuiActionRunner.execute(new GuiQuery<JFrame>() {
			protected JFrame executeInEDT() {
				return new JFrame();
			}
		});
		FrameFixture window = new FrameFixture( frame ) ;
		window.show();
}
implementando apenas swing puro vejo que funciona tranquilo
@Test public void testSimpleDemo() throws Exception {
		Frame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setUndecorated(true);
		
		JPanel baseline = new JPanel( );
		baseline.add( new JButton( "test" ) );
		frame.add( baseline );
		
		frame.pack();
		frame.setVisible(true);
}
o codigo acima [metodo=testSimpleDemo] funciona normalmente emitindo no log apenas as duas primeiras linhas do log que mencionei anteriormente:
010-06-24 16:54:10.267 java[1805:903] [Java CocoaComponent compatibility mode]: Enabled 2010-06-24 16:54:10.273 java[1805:903] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000

já o codigo [metodo=testCompatibilityCocoaMac64Bits] dah o erro do log completo. na minha app utilizo swt em uma versão não stable, requerendo versão 3.6M.X, para x>=3, isto por conta do DJProject que utilizamos.

fiz um exemplo a parte utilizando DJProject que utiliza swt por baixo dos panos, e funcionou normalmente. então aparentemente não parece ser incompatibilidade apenas do jar(cocoa, cocoa64bits, carbon = ambos testados em varias versões desde 3.6M3 à 3.6M7, utilizando jdk 1,6.0_20 para 32 e 64bits). segue abaixo código:
public static void main(String[] args) {

		UIUtils.setPreferredLookAndFeel();
		NativeInterface.open();
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFlashPlayer jwb = new JFlashPlayer();
				
				jwb.load( FileSystemResourceOnlyTesting.FLASH_AD_FROG_SAMPLE.getFile().getAbsolutePath() ); // caminho local arquivo swf
				jwb.play( );
				
				JFrame frame = new JFrame("DJ Native Swing Test");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.getContentPane().add( jwb,
						BorderLayout.CENTER);
				frame.setSize(800, 600);
				frame.setLocationByPlatform(true);
				frame.setVisible(true);
			}
		});
		NativeInterface.runEventPump();
		
	}
bem, continuo na luta para fazer o teste passar, :k-> green bar! :F
faelcavalcanti

bem, investigando um pouco mais afundo, vi que o problema é generalizado devido as novas mudanças da nova versão do mac os 10.6.X (darwin).

esta nova versão introduziu algumas mudanças comportamentais, como por exemplo na parte de concorrência, por exemplo:

New NSBlockOperation class for block-based operations. See ?Concurrency with Operation Objects.?

acho que isto justifica as incompatibilidades aparentes registradas, por exemplo neste bug similar (ao sintoma e intenção) registrado:
[list][SWT/AWT] SWT_AWT Bridge doesn't appear to be working : Inclusive reproduzi este bug na minha máquina, basta criar projeto básico java e adicionar este snippet, em conjunto com qualquer jar 3.6M+ [exemplo=3.6M3] [/list]

seguem outros bugs com mesmo sintoma:
[list][OpenGL] MAC OS Leopard: OpenGL error with snippet 195[/list][list][OpenGL] Snippet195 doesn't exit properly[/list][list][OpenGL] MAC OS Leopard: OpenGL error with snippet 195[/list]

estes últimos indicam que o mesmo problema ocorre na versão do mac os leopard. resumindo a versão 3.6 (swt) ainda está no milestone 3.6M8 em desenvolvimento como versão não stable, e parte de códigos ainda não disponíveis. e é este caso que irei mencionar agora.

então como eu estava utilizando um projeto [DJProject] que requer ao menos versão 3.6M3+(higher) do swt, vou explicar agora porque não funcionava. segue novamente o código que eu pensei que funcionava para todos os casos:
public static void main(String[] args) {

		UIUtils.setPreferredLookAndFeel();
		NativeInterface.open();
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFlashPlayer jwb = new JFlashPlayer();
				jwb.load( FileSystemResourceOnlyTesting.FLASH_AD_FROG_SAMPLE.getFile().getAbsolutePath() ); // url local de arquivo swf
				jwb.play( );
				
				JFrame frame = new JFrame("DJ Native Swing Test");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.getContentPane().add( jwb, BorderLayout.CENTER);

				frame.setSize(800, 600);
				frame.setLocationByPlatform(true);
				frame.pack();
				frame.setVisible(true);
			}
		});
		NativeInterface.runEventPump();
		
	}
em seguida na linha 14 acima, eu adiciono o seguinte código:
frame.getContentPane().add( new JButton("teste"), BorderLayout.NORTH);

isto já é suficiente para obter o seguinte erro:

2010-06-27 20:13:33.334 java[10583:a07] [Java CocoaComponent compatibility mode]: Enabled
2010-06-27 20:13:33.364 java[10583:a07] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2010-06-27 20:13:35.055 java[10583:d303] *** -[NSConditionLock unlock]: lock ( '(null)') unlocked when not locked
2010-06-27 20:13:35.056 java[10583:d303] *** Break on _NSLockError() to debug.
java.lang.RuntimeException: org.eclipse.swt.SWTError: Not implemented
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.processCommandResult(MessagingInterface.java:319)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.syncSend(MessagingInterface.java:306)
at chrriis.dj.nativeswing.swtimpl.NativeInterface.syncSend(NativeInterface.java:296)
at chrriis.dj.nativeswing.swtimpl.Message.syncSend(Message.java:64)
at chrriis.dj.nativeswing.swtimpl.CommandMessage.syncExec(CommandMessage.java:55)
at chrriis.dj.nativeswing.swtimpl.NativeComponent.runSync(NativeComponent.java:148)
at chrriis.dj.nativeswing.swtimpl.NativeComponent.createNativePeer(NativeComponent.java:806)
at chrriis.dj.nativeswing.swtimpl.NativeComponent.access$12(NativeComponent.java:790)
at chrriis.dj.nativeswing.swtimpl.NativeComponent$9.run(NativeComponent.java:701)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:633)
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)
Caused by: org.eclipse.swt.SWTError: Not implemented
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.awt.SWT_AWT.new_Shell(Unknown Source)
at chrriis.dj.nativeswing.swtimpl.NativeComponent$CMN_createControl.createShell(NativeComponent.java:449)
at chrriis.dj.nativeswing.swtimpl.NativeComponent$CMN_createControl.run(NativeComponent.java:498)
at chrriis.dj.nativeswing.swtimpl.CommandMessage.runCommand(CommandMessage.java:61)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.runMessage(MessagingInterface.java:115)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.processReceivedMessages(MessagingInterface.java:100)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.access$2(MessagingInterface.java:88)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface$2$2.run(MessagingInterface.java:410)
at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at chrriis.dj.nativeswing.swtimpl.NativeInterface$InProcess.runEventPump(NativeInterface.java:463)
at chrriis.dj.nativeswing.swtimpl.NativeInterface.runEventPump(NativeInterface.java:385)
at com.xxx.yyy.client.ui.swing.widget.Testt.main(ContentView.java:125)
java.lang.NullPointerException
at chrriis.dj.nativeswing.swtimpl.NativeComponent$CMN_reshape.run(NativeComponent.java:221)
at chrriis.dj.nativeswing.swtimpl.CommandMessage.runCommand(CommandMessage.java:61)
at chrriis.dj.nativeswing.swtimpl.ControlCommandMessage.runCommand(ControlCommandMessage.java:164)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.runMessage(MessagingInterface.java:115)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.processReceivedMessages(MessagingInterface.java:100)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.access$2(MessagingInterface.java:88)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface$2$2.run(MessagingInterface.java:410)
at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at chrriis.dj.nativeswing.swtimpl.NativeInterface$InProcess.runEventPump(NativeInterface.java:463)
at chrriis.dj.nativeswing.swtimpl.NativeInterface.runEventPump(NativeInterface.java:385)
at com.xxx.yyy.client.ui.swing.widget.Testt.main(ContentView.java:125)

isto indica o porquê (ou pelo menos parte dele) na aplicação que estou desenvolvendo não funcionava. utilizei várias versões do swt do 3.6M3 ao 3.6M7, tanto cocoa (necessário colocar parâmetro -d32 para rodar em caso de jdk-64bits) e cocoa-64bits. não testei no carbon pois não é compatível com meu mac 10.6.3 (darwin).

quando removi tudo que usa swt, o projeto funcionou, e percebi que alguns outros desenvolvedores de outros projetos tb tiveram decisão parecida (caso do xith e gwt) ou implementando um fake (caso do jmonkey, inclusive em blog de cara com gambi temporária para quem tem mac).

então só me restou a pergunta: qual a previsão do eclipse helios e versão stable do swt 3.6?

faelcavalcanti

estive correndo com outras features do projeto, mas consegui resolver, mas não com solução 100% de garantia e redonda, devido as versões de cocoa e jre p/32-64 bits. além disto existe a portabilidade necessária para windows e linux.

bem, o que venho a citar, é apenas um caso curioso, que não é o meu caso, mas que vi para awt -> swt que acabei achando na busca do codehaus do projeto GumTree, onde geralmente é recomendado utilizar SWT_AWT.newFrame( componsite ), conforme indicado neste tutorial.

percebi logo após que existe citação para isto no FAQ do eclipse, recomendando instalar bibliotecas compatíveis para mac e solaris. Basta saber se isto foi sanado no JRE 6.x, mas pelo jeito parece que não.

existem bugs não recentes(2009), ainda abertos, por exemplo este, que reproduzi tb, com mesmo sintoma.

Criado 27 de junho de 2010
Ultima resposta 2 de jul. de 2010
Respostas 3
Participantes 1