Barrier turn on/off - PacketOut bypass
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / core / connection / OutboundQueueEntry.java
index 48722dbbdd3d0db856fa83af27953b1e2dcc3e6a..a97a50e9b8d1fb1e3843bfeff61b00f03c9432ff 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueExcept
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,10 +58,18 @@ final class OutboundQueueEntry {
 
     OfHeader takeMessage() {
         final OfHeader ret = message;
+        checkCompletionNeed();
         message = null;
         return ret;
     }
 
+    private void checkCompletionNeed() {
+        if (callback == null || PacketOutInput.class.isInstance(message)) {
+            completed = true;
+            callback = null;
+        }
+    }
+
     boolean complete(final OfHeader response) {
         Preconditions.checkState(!completed, "Attempted to complete a completed message with response %s", response);
 
@@ -77,6 +86,10 @@ final class OutboundQueueEntry {
         completed = reallyComplete;
         if (callback != null) {
             callback.onSuccess(response);
+            if (reallyComplete) {
+                // We will not need the callback anymore, make sure it can be GC'd
+                callback = null;
+            }
         }
         LOG.debug("Entry {} completed {} with response {}", this, completed, response);
         return reallyComplete;
@@ -87,10 +100,10 @@ final class OutboundQueueEntry {
             completed = true;
             if (callback != null) {
                 callback.onFailure(cause);
+                callback = null;
             }
         } else {
             LOG.warn("Ignoring failure {} for completed message", cause);
         }
     }
-
 }