src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/Coordinator.java

Print this page

        

@@ -92,79 +92,41 @@
 
     public <T extends XmlAdapter> boolean containsAdapter(Class<T> type) {
         return adapters.containsKey(type);
     }
 
-    /**
-     * The {@link Coordinator} in charge before this {@link Coordinator}.
-     */
-    private Object old;
-
-    /**
-     * A 'pointer' to a {@link Coordinator} that keeps track of the currently active {@link Coordinator}.
-     * Having this improves the runtime performance.
-     */
-    private Object[] table;
-
-    /**
-     * When we set {@link #table} to null, record who did it.
-     * This is for trouble-shooting a possible concurrency issue reported at:
-     * http://forums.java.net/jive/thread.jspa?threadID=15132
-     */
-    public Exception guyWhoSetTheTableToNull;
-
-    /**
-     * Associates this {@link Coordinator} with the current thread.
-     * Should be called at the very beginning of the episode.
-     */
-    protected final void setThreadAffinity() {
-        table = activeTable.get();
-        assert table!=null;
-    }
+    // this much is necessary to avoid calling get and set twice when we push.
+    private static final ThreadLocal<Coordinator> activeTable = new ThreadLocal<Coordinator>();
 
     /**
-     * Dis-associate this {@link Coordinator} with the current thread.
-     * Sohuld be called at the end of the episode to avoid memory leak.
+     * The {@link Coordinator} in charge before this {@link Coordinator}.
      */
-    protected final void resetThreadAffinity() {
-        if (activeTable != null) {
-            activeTable.remove();
-        }
-        if(debugTableNPE)
-            guyWhoSetTheTableToNull = new Exception(); // remember that we set it to null
-        table = null;
-    }
+    private Coordinator old;
 
     /**
      * Called whenever an execution flow enters the realm of this {@link Coordinator}.
      */
     protected final void pushCoordinator() {
-        old = table[0];
-        table[0] = this;
+        old = activeTable.get();
+        activeTable.set(this);
     }
 
     /**
      * Called whenever an execution flow exits the realm of this {@link Coordinator}.
      */
     protected final void popCoordinator() {
-        assert table[0]==this;
-        table[0] = old;
+        if (old != null)
+            activeTable.set(old);
+        else
+            activeTable.remove();
         old = null; // avoid memory leak
     }
 
     public static Coordinator _getInstance() {
-        return (Coordinator) activeTable.get()[0];
+        return activeTable.get();
     }
 
-    // this much is necessary to avoid calling get and set twice when we push.
-    private static final ThreadLocal<Object[]> activeTable = new ThreadLocal<Object[]>() {
-        @Override
-        public Object[] initialValue() {
-            return new Object[1];
-        }
-    };
-
 //
 //
 // ErrorHandler implementation
 //
 //

@@ -205,15 +167,6 @@
             // bail-out of the parse with a SAX exception, but convert it into
             // an UnmarshalException back in in the AbstractUnmarshaller
             throw saxException;
         }
     }
-
-    public static boolean debugTableNPE;
-
-    static {
-        try {
-            debugTableNPE = Boolean.getBoolean(Coordinator.class.getName()+".debugTableNPE");
-        } catch (SecurityException t) {
-        }
-    }
 }