Also report stored posts further up in Skyframe

As SkyFunctions are supposed to be restartable, e.g., if prerequisites are
missing, events generated by them are temporarily stored. So are BuildEvents
posted by them. However, once the evaluation of a SkyFunction is finalized,
the stored posts need to be reposted. Do this.

Change-Id: I4ce20266fbfcbb298e93eb53086fa9916874f5d8
PiperOrigin-RevId: 157575119
diff --git a/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java b/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java
index e68c5d2..008b893 100644
--- a/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/events/StoredEventHandler.java
@@ -28,6 +28,10 @@
     return ImmutableList.copyOf(events);
   }
 
+  public synchronized ImmutableList<ExtendedEventHandler.Postable> getPosts() {
+    return ImmutableList.copyOf(posts);
+  }
+
   /** Returns true if there are no stored events. */
   public synchronized boolean isEmpty() {
     return events.isEmpty() && posts.isEmpty();
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
index 1a56de2..715ff67 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
@@ -524,6 +524,10 @@
    */
   void commit(NodeEntry primaryEntry, EnqueueParentBehavior enqueueParents)
       throws InterruptedException {
+    for (ExtendedEventHandler.Postable post : eventHandler.getPosts()) {
+      evaluatorContext.getReporter().post(post);
+    }
+
     // Construct the definitive error info, if there is one.
     finalizeErrorInfo();