Summary: | GNU/Linux DRM Freezes when manipulating the PointerIcon (setting & visibility) | ||
---|---|---|---|
Product: | [JogAmp] Jogl | Reporter: | Sven Gothel <sgothel> |
Component: | embedded | Assignee: | Sven Gothel <sgothel> |
Status: | RESOLVED FIXED | ||
Severity: | blocker | CC: | xerxes |
Priority: | P4 | ||
Version: | 2.4.0 | ||
Hardware: | All | ||
OS: | linux | ||
Type: | DEFECT | SCM Refs: |
d5ba4cae824087879a4857e20961a95da04eaebb
66976571abed5f14db5de9975ce08d62cfecc2c8
c7778616ef7706461ee0b09e20591f5a6e4ea363
59fe721a926ff66e98b716a25a08bdfa584ca6fa
eaa81d524e9be6af9867c8b6750505c8660a6651
bfc152be4203eeceebea919aff9513d33213c802
ea23776919eff10dee57519ce72354bbaea3544e
84a2e5a250148d600d48a0dd58e07286a375f616
033ee4cad3493038480b06f6caf3de015a3e8de7
|
Workaround: | --- | ||
Bug Depends on: | 1156 | ||
Bug Blocks: | 1405, 1406 |
Description
Sven Gothel
2019-12-04 21:02:09 CET
Reproduced this freeze on a GNU/Linux x86_64 Intel Broadwell device, besides Raspberry Pi 3B+ and 4B. (In reply to Sven Gothel from comment #0) > > Potentially we have missed using a device lock here. We are using the ResourceToolkitLock, but did not put pointer manipulation within a locked block. However, after adding lock/unlock decoration the freeze still appears. Test is run as follows on Raspberry Pi: cd projects/JogAmp/jogl/make bash scripts/test-demo-launcher0.sh `which java` ../build-linux-armv6hf -time 10000 -noanim -vsync 0 and on x86_64 cd projects/JogAmp/jogl/make bash scripts/test-demo-launcher0.sh `which java` ../build-x86_64 -time 10000 -noanim -vsync 0 d5ba4cae824087879a4857e20961a95da04eaebb NEWT: Align DisplayImpl.createPointerIcon(..) behavior; PointerIconImpl.validatedHandle() shall not create native resource. 66976571abed5f14db5de9975ce08d62cfecc2c8 Bug 1408: NEWT DRM/GBM DisplayDriver: Add device locking/unlocking decoration for PointerIcon operations c7778616ef7706461ee0b09e20591f5a6e4ea363 Bug 1408: NEWT DisplayImpl PointerIcon: Property 'newt.disable.PointerIcon' disables PointerIcon usage in general. 59fe721a926ff66e98b716a25a08bdfa584ca6fa Bug 1408: NEWT DRM/GBM WindowDriver: Adding glFinish() before eglSwapBuffers(..) just in case .. (In reply to Sven Gothel from comment #4) Looks like we have finally a winner: > c7778616ef7706461ee0b09e20591f5a6e4ea363 > Bug 1408: NEWT DisplayImpl PointerIcon: Property 'newt.disable.PointerIcon' > disables PointerIcon usage in general. Disabling the PointerIcon (and hence DRM Cursor manipulation) makes _the_ difference. Enabling it (dropping the property from the commandline) reproduces the freezes. This is regardless whether we use VSYNC or the animator thread. Note: The generic device locking occurs throughout NEWT display and JOGL, i.e. during DRM cursor manipulation or GL rendering and swapSurface. The freeze even occurs at startup on Raspi-3b+ Needs a good investigation now. eaa81d524e9be6af9867c8b6750505c8660a6651 Bug 1406, Bug 1405: demos.Launcher0: Allow passing GLEventListener via '-demo classname' bfc152be4203eeceebea919aff9513d33213c802 NEWTDemoListener: Fix NPE ea23776919eff10dee57519ce72354bbaea3544e Bug 1406, Bug 1405: demos.Launcher0: Defaults to use multiple PointerIcons again launch script test-demo-launcher0.sh: Tested with '-Xcheck:jni' 84a2e5a250148d600d48a0dd58e07286a375f616 LinuxKeyEventTracker: Factor out 'sendKeyEvent(..)' call with null check. The actual fix: 033ee4cad3493038480b06f6caf3de015a3e8de7 Bug 1405, Bug 1406, Bug 1408: Resolution: Call ReleasePrimitiveArrayCritical(..) in GetPrimitiveArrayCritical(..) code path! Now that was quite a miss, causing the bugs in the first place! The freeze was caused in the JVM, as this open GetPrimitiveArrayCritical(..) disabled the GC. This was reported via '-Xcheck:jni'. Depending on the system/jvm, the freeze may happen early or only after a while. This code path was not executed with new property 'newt.disable.PointerIcon' set, but from there to finding the missing critical release - a journey: - jstack showed "main" #1 prio=5 os_prio=0 cpu=275.71ms elapsed=51.93s allocated=9710K defined_classes=472 tid=0x00007f7084015000 nid=0x1a39 waiting on condition [0x00007f 70897c2000] java.lang.Thread.State: RUNNABLE at jogamp.opengl.es3.GLES3Impl.dispatch_glUniformMatrix4fv1(Native Method) at jogamp.opengl.es3.GLES3Impl.glUniformMatrix4fv(GLES3Impl.java:2585) at jogamp.opengl.es3.GLES3Impl.glUniform(GLES3Impl.java:10713) -- said that this thread was no more running, waiting on condition .. -- glUniformMatrix4fv1 was given an array! - '-Xcheck:jni' gave: Warning: Calling other JNI functions in the scope of Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical -- Now it is clear that the lack of releasing the critical array, returning to Java and then calling other JNI methods caused the Warning - and eventually the freeze. |