ABEND on Shutdown

JOGL Team (Chris, Ken, etc)-

[I’m still an open source plebe, so I don’t know what the customs are. Please forgive.]

JOGL’s Gears.java issues a Windows application error when I close the app. Something about memory location 0x0020 being unreadable.

I had the same problem with Magician. It happens when the JVM exits before the rendering thread terminates gracefully (e.g. no cleanup, might be in the middle of a frame update, whatever).

My fix was to register a system shutdown thread that would shutdown all the rendering threads. The code snippet from Magician’s Bootstrap.java is


      static ShutdownThread _reaper = null;
      
      static
      {
            Runtime runtime = Runtime.getRuntime();
            _reaper = new ShutdownThread();
            runtime.addShutdownHook( _reaper );
      }
      
      // Package visible only.
      static void shutMeDown( GLDrawable drawable )
      {
            _reaper.addDrawable( drawable );
      }

The ShutdownThread.java is very straightforward. It extends Runnable, has an addDrawable(…) method, a run() method which calls destroy() on each registered GLDrawable and that’s about it. It uses a WeakHashMap, so it won’t prevent garbage collection.

Each GLDrawable in Magician registers itself from within the constructor.

I guess that’s enough information to roll something into JOGL.

Cheers, Jason

Jason: thanks for your report. What version of Windows and what graphics card does this occur with? Currently we’ve tested with NVidia cards on Windows and Linux, as well as the Sun XVR-1200 on Solaris, and haven’t seen this problem. Note that the windowClosing listener for the top-level frame calls animator.stop(), which should prevent rendering during application teardown. Before we added the call to Animator.stop() we would routinely see (Java) exceptions during teardown, and if Control-C is used to terminate the application then we expect the behavior you describe.

Regardless please file a bug report using the Issue Tracking at http://jogl.dev.java.net/ so we can track this.