Make FlowOperationsProcessor thread-safe with synchronized modifier
Different threads could call run(), satisfy() and fail() method. Each of the methods reads/writes multiple fields during the method call. These method calls need to be synchronized to gurantee to see the latest value. Change-Id: Ic252b56e0902170d7e0fdb83f96f0fb2e55ec56b
Showing
1 changed file
with
3 additions
and
3 deletions
... | @@ -587,7 +587,7 @@ public class FlowRuleManager | ... | @@ -587,7 +587,7 @@ public class FlowRuleManager |
587 | } | 587 | } |
588 | 588 | ||
589 | @Override | 589 | @Override |
590 | - public void run() { | 590 | + public synchronized void run() { |
591 | if (stages.size() > 0) { | 591 | if (stages.size() > 0) { |
592 | process(stages.remove(0)); | 592 | process(stages.remove(0)); |
593 | } else if (!hasFailed.get() && context != null) { | 593 | } else if (!hasFailed.get() && context != null) { |
... | @@ -632,7 +632,7 @@ public class FlowRuleManager | ... | @@ -632,7 +632,7 @@ public class FlowRuleManager |
632 | } | 632 | } |
633 | } | 633 | } |
634 | 634 | ||
635 | - void satisfy(DeviceId devId) { | 635 | + synchronized void satisfy(DeviceId devId) { |
636 | pendingDevices.remove(devId); | 636 | pendingDevices.remove(devId); |
637 | if (pendingDevices.isEmpty()) { | 637 | if (pendingDevices.isEmpty()) { |
638 | operationsService.execute(this); | 638 | operationsService.execute(this); |
... | @@ -641,7 +641,7 @@ public class FlowRuleManager | ... | @@ -641,7 +641,7 @@ public class FlowRuleManager |
641 | 641 | ||
642 | 642 | ||
643 | 643 | ||
644 | - void fail(DeviceId devId, Set<? extends FlowRule> failures) { | 644 | + synchronized void fail(DeviceId devId, Set<? extends FlowRule> failures) { |
645 | hasFailed.set(true); | 645 | hasFailed.set(true); |
646 | pendingDevices.remove(devId); | 646 | pendingDevices.remove(devId); |
647 | if (pendingDevices.isEmpty()) { | 647 | if (pendingDevices.isEmpty()) { | ... | ... |
-
Please register or login to post a comment