src/jdk.compiler/share/classes/com/sun/tools/javac/api/MultiTaskListener.java
changeset 49197 cc2673fa8c20
parent 47216 71c04702a3d5
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/MultiTaskListener.java	Fri Mar 09 11:36:12 2018 +0800
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/MultiTaskListener.java	Fri Mar 09 09:42:10 2018 +0100
@@ -30,6 +30,8 @@
 
 import com.sun.source.util.TaskEvent;
 import com.sun.source.util.TaskListener;
+import com.sun.tools.javac.code.DeferredCompletionFailureHandler;
+import com.sun.tools.javac.code.DeferredCompletionFailureHandler.Handler;
 import com.sun.tools.javac.util.Context;
 import com.sun.tools.javac.util.DefinedBy;
 import com.sun.tools.javac.util.DefinedBy.Api;
@@ -50,6 +52,8 @@
     /** Empty array of task listeners */
     private static final TaskListener[] EMPTY_LISTENERS = new TaskListener[0];
 
+    private final DeferredCompletionFailureHandler dcfh;
+
     /** Get the MultiTaskListener instance for this context. */
     public static MultiTaskListener instance(Context context) {
         MultiTaskListener instance = context.get(taskListenerKey);
@@ -61,6 +65,7 @@
     protected MultiTaskListener(Context context) {
         context.put(taskListenerKey, this);
         ccw = ClientCodeWrapper.instance(context);
+        dcfh = DeferredCompletionFailureHandler.instance(context);
     }
 
     /**
@@ -106,18 +111,28 @@
 
     @Override @DefinedBy(Api.COMPILER_TREE)
     public void started(TaskEvent e) {
-        // guard against listeners being updated by a listener
-        TaskListener[] ll = this.listeners;
-        for (TaskListener l: ll)
-            l.started(e);
+        Handler prevDeferredHandler = dcfh.setHandler(dcfh.userCodeHandler);
+        try {
+            // guard against listeners being updated by a listener
+            TaskListener[] ll = this.listeners;
+            for (TaskListener l: ll)
+                l.started(e);
+        } finally {
+            dcfh.setHandler(prevDeferredHandler);
+        }
     }
 
     @Override @DefinedBy(Api.COMPILER_TREE)
     public void finished(TaskEvent e) {
-        // guard against listeners being updated by a listener
-        TaskListener[] ll = this.listeners;
-        for (TaskListener l: ll)
-            l.finished(e);
+        Handler prevDeferredHandler = dcfh.setHandler(dcfh.userCodeHandler);
+        try {
+            // guard against listeners being updated by a listener
+            TaskListener[] ll = this.listeners;
+            for (TaskListener l: ll)
+                l.finished(e);
+        } finally {
+            dcfh.setHandler(prevDeferredHandler);
+        }
     }
 
     @Override