From 74019520e8d82d03f5cf95729456717b34060f5d Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Wed, 13 Mar 2013 07:15:41 +0100
Subject: Minor Changes: EGLDisplayUtil: Add stack trace in DEBUG mode for
 opened DPYs; JAWTWindow: Add JAWT info in toString()

---
 src/jogl/classes/javax/media/opengl/GLContext.java |  4 +-
 .../classes/jogamp/opengl/egl/EGLDisplayUtil.java  | 76 +++++++++++++++++-----
 .../com/jogamp/nativewindow/awt/JAWTWindow.java    | 33 ++++++----
 .../classes/com/jogamp/newt/awt/NewtCanvasAWT.java |  2 +-
 4 files changed, 85 insertions(+), 30 deletions(-)

(limited to 'src')

diff --git a/src/jogl/classes/javax/media/opengl/GLContext.java b/src/jogl/classes/javax/media/opengl/GLContext.java
index c31b76401..05200324d 100644
--- a/src/jogl/classes/javax/media/opengl/GLContext.java
+++ b/src/jogl/classes/javax/media/opengl/GLContext.java
@@ -477,12 +477,12 @@ public abstract class GLContext {
   public abstract GL setGL(GL gl);
 
   /**
-   * Returns the native GL context handle
+   * Returns the underlying native OpenGL context handle
    */
   public final long getHandle() { return contextHandle; }
 
   /**
-   * Indicates whether the underlying OpenGL context has been created.
+   * Indicates whether the underlying native OpenGL context has been created.
    */
   public final boolean isCreated() {
     return 0 != contextHandle;
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java b/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java
index 1f6f49f88..f2efb0479 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLDisplayUtil.java
@@ -38,7 +38,7 @@ import javax.media.opengl.GLException;
 
 import jogamp.opengl.Debug;
 
-import com.jogamp.common.util.LongIntHashMap;
+import com.jogamp.common.util.LongObjectHashMap;
 import com.jogamp.nativewindow.egl.EGLGraphicsDevice;
 
 /** 
@@ -54,11 +54,26 @@ import com.jogamp.nativewindow.egl.EGLGraphicsDevice;
 public class EGLDisplayUtil {
     protected static final boolean DEBUG = Debug.debug("EGLDisplayUtil");
     
-    static LongIntHashMap eglDisplayCounter;
+    private static class DpyCounter {
+        final long eglDisplay;
+        final Throwable createdStack;
+        int refCount;
+        
+        private DpyCounter(long eglDisplay) {
+            this.eglDisplay = eglDisplay;
+            this.refCount = 0;
+            this.createdStack = DEBUG ? new Throwable() : null;
+        }
+        
+        public String toString() {
+            return "EGLDisplay[0x"+Long.toHexString(eglDisplay)+": refCnt "+refCount+"]";
+        }
+    }
+    static final LongObjectHashMap eglDisplayCounter;
     
     static {
-        eglDisplayCounter = new LongIntHashMap();
-        eglDisplayCounter.setKeyNotFoundValue(0);
+        eglDisplayCounter = new LongObjectHashMap();
+        eglDisplayCounter.setKeyNotFoundValue(null);
     }
 
     /** 
@@ -80,9 +95,13 @@ public class EGLDisplayUtil {
     public static void dumpOpenDisplayConnections() {
         System.err.println("EGLDisplayUtil: Open EGL Display Connections: "+eglDisplayCounter.size());
         int i=0;
-        for(Iterator<LongIntHashMap.Entry> iter = eglDisplayCounter.iterator(); iter.hasNext(); i++) {
-            final LongIntHashMap.Entry e = iter.next();
-            System.err.println("EGLDisplayUtil: Open["+i+"]: 0x"+Long.toHexString(e.key)+": refCnt "+e.value);
+        for(Iterator<LongObjectHashMap.Entry> iter = eglDisplayCounter.iterator(); iter.hasNext(); i++) {
+            final LongObjectHashMap.Entry e = iter.next();
+            final DpyCounter v = (DpyCounter) e.value;
+            System.err.println("EGLDisplayUtil: Open["+i+"]: 0x"+Long.toHexString(e.key)+": "+v);
+            if(null != v.createdStack) {
+                v.createdStack.printStackTrace();
+            }
         }
     }
     
@@ -108,18 +127,32 @@ public class EGLDisplayUtil {
         if( EGL.EGL_NO_DISPLAY == eglDisplay) {
             return false;
         }
-        final boolean res;    
-        final int refCnt = eglDisplayCounter.get(eglDisplay) + 1; // 0 + 1 = 1 -> 1st init
+        final int refCnt;
+        final DpyCounter d;
+        {
+            DpyCounter _d = (DpyCounter) eglDisplayCounter.get(eglDisplay);
+            if(null == _d) {
+                _d = new DpyCounter(eglDisplay);
+                refCnt = 1; // 1st init
+            } else {
+                refCnt = _d.refCount + 1;
+            }
+            d = _d;
+        }
+        final boolean res;
         if(1==refCnt) { // only initialize once
             res = EGL.eglInitialize(eglDisplay, major, minor);
         } else {
             res = true;
-        }        
-        if(res) { // map if successfully initialized, only  
-            eglDisplayCounter.put(eglDisplay, refCnt);
+        }
+        if(res) { // update refCount and map if successfully initialized, only
+            d.refCount = refCnt;
+            if(1 == refCnt) {
+                eglDisplayCounter.put(eglDisplay, d);
+            }
         }
         if(DEBUG) {
-            System.err.println("EGLDisplayUtil.eglInitialize2("+EGLContext.toHexString(eglDisplay)+" ...): #"+refCnt+" = "+res);
+            System.err.println("EGLDisplayUtil.eglInitialize("+EGLContext.toHexString(eglDisplay)+" ...): #"+refCnt+", "+d+" = "+res);
             // Thread.dumpStack();
         }
         return res;
@@ -186,13 +219,24 @@ public class EGLDisplayUtil {
             return false;
         }
         final boolean res;    
-        final int refCnt = eglDisplayCounter.get(eglDisplay) - 1; // 1 - 1 = 0 -> final terminate
-        if(0==refCnt) { // no terminate if still in use or already terminated
+        final int refCnt;
+        final DpyCounter d;
+        {
+            DpyCounter _d = (DpyCounter) eglDisplayCounter.get(eglDisplay);
+            if(null == _d) {
+                _d = null;
+                refCnt = -1; // n/a
+            } else {
+                refCnt = _d.refCount - 1; // 1 - 1 = 0 -> final terminate
+            }
+            d = _d;
+        }
+        if( 0 == refCnt ) { // no terminate if still in use or already terminated
             res = EGL.eglTerminate(eglDisplay);
             eglDisplayCounter.remove(eglDisplay);
         } else {
             if(0 < refCnt) { // no negative refCount
-                eglDisplayCounter.put(eglDisplay, refCnt);
+                d.refCount = refCnt;
             } 
             res = true;
         }
diff --git a/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java b/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java
index d65f8c231..99b629d1a 100644
--- a/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java
+++ b/src/nativewindow/classes/com/jogamp/nativewindow/awt/JAWTWindow.java
@@ -315,13 +315,7 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface,
   protected abstract int lockSurfaceImpl() throws NativeWindowException;
 
   protected void dumpJAWTInfo() {
-      if(null != jawt) {
-          System.err.println("JAWT version: 0x"+Integer.toHexString(jawt.getCachedVersion())+
-                             ", CA_LAYER: "+ JAWTUtil.isJAWTUsingOffscreenLayer(jawt)+
-                             ", isLayeredSurface "+isOffscreenLayerSurfaceEnabled()+", bounds "+bounds+", insets "+insets);
-      } else {
-          System.err.println("JAWT n/a, bounds "+bounds+", insets "+insets);
-      }
+      System.err.println(jawt2String(null).toString());
       // Thread.dumpStack();
   }
 
@@ -555,15 +549,32 @@ public abstract class JAWTWindow implements NativeWindow, OffscreenLayerSurface,
       return component.hasFocus();
   }
 
+  protected StringBuilder jawt2String(StringBuilder sb) {
+      if( null == sb ) {
+          sb = new StringBuilder();
+      }
+      if(null != jawt) {
+          sb.append("JAWT version: 0x").append(Integer.toHexString(jawt.getCachedVersion())).
+          append(", CA_LAYER: ").append(JAWTUtil.isJAWTUsingOffscreenLayer(jawt)).
+          append(", isLayeredSurface ").append(isOffscreenLayerSurfaceEnabled()).append(", bounds ").append(bounds).append(", insets ").append(insets);
+      } else {
+          sb.append("JAWT n/a, bounds ").append(bounds).append(", insets ").append(insets);
+      }
+      return sb;
+  }
+  
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();
 
-    sb.append("JAWT-Window["+
-                "windowHandle "+toHexString(getWindowHandle())+
+    sb.append("JAWT-Window[");
+    jawt2String(sb);
+    sb.append(  ", shallUseOffscreenLayer "+shallUseOffscreenLayer+", isOffscreenLayerSurface "+isOffscreenLayerSurface+
+                ", attachedSurfaceLayer "+toHexString(getAttachedSurfaceLayer())+
+                ", windowHandle "+toHexString(getWindowHandle())+
                 ", surfaceHandle "+toHexString(getSurfaceHandle())+
-                ", bounds "+bounds+", insets "+insets+
-                ", shallUseOffscreenLayer "+shallUseOffscreenLayer+", isOffscreenLayerSurface "+isOffscreenLayerSurface);
+                ", bounds "+bounds+", insets "+insets
+                );
     if(null!=component) {
       sb.append(", pos "+getX()+"/"+getY()+", size "+getWidth()+"x"+getHeight()+
                 ", visible "+component.isVisible());
diff --git a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
index 3c10859bf..9d5a878c6 100644
--- a/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
+++ b/src/newt/classes/com/jogamp/newt/awt/NewtCanvasAWT.java
@@ -416,7 +416,7 @@ public class NewtCanvasAWT extends java.awt.Canvas implements WindowClosingProto
                 }
             }            
         }
-        if( ( removeNotify || windowClosing ) && null!=jawtWindow) {
+        if( ( removeNotify || windowClosing ) && null!=jawtWindow ) {
             NewtFactoryAWT.destroyNativeWindow(jawtWindow);
             jawtWindow=null;
         }        
-- 
cgit v1.2.3