X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDataChangeListenerRegistrationProxy.java;h=acf630e2e95598e71fdbd786da628f3524a29408;hp=e3cdbb4ee131d1b0961e9d57c8eeb5ee6e568b61;hb=9f61e98b036119694dfef0759a7cafc56aae6e86;hpb=0eb621d29daaf08979c356e2148e99c48458e169 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java index e3cdbb4ee1..acf630e2e9 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DataChangeListenerRegistrationProxy.java @@ -25,9 +25,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; *

*/ public class DataChangeListenerRegistrationProxy implements ListenerRegistration { - private final ActorSelection listenerRegistrationActor; + private volatile ActorSelection listenerRegistrationActor; private final AsyncDataChangeListener listener; private final ActorRef dataChangeListenerActor; + private boolean closed = false; public >> DataChangeListenerRegistrationProxy( @@ -38,14 +39,51 @@ public class DataChangeListenerRegistrationProxy implements ListenerRegistration this.dataChangeListenerActor = dataChangeListenerActor; } + public >> + DataChangeListenerRegistrationProxy( + L listener, ActorRef dataChangeListenerActor) { + this(null, listener, dataChangeListenerActor); + } + @Override public Object getInstance() { return listener; } + public void setListenerRegistrationActor(ActorSelection listenerRegistrationActor) { + boolean sendCloseMessage = false; + synchronized(this) { + if(closed) { + sendCloseMessage = true; + } else { + this.listenerRegistrationActor = listenerRegistrationActor; + } + } + if(sendCloseMessage) { + listenerRegistrationActor.tell(new + CloseDataChangeListenerRegistration().toSerializable(), null); + } + + this.listenerRegistrationActor = listenerRegistrationActor; + } + + public ActorSelection getListenerRegistrationActor() { + return listenerRegistrationActor; + } + @Override public void close() { - listenerRegistrationActor.tell(new CloseDataChangeListenerRegistration().toSerializable(), null); + + boolean sendCloseMessage; + synchronized(this) { + sendCloseMessage = !closed && listenerRegistrationActor != null; + closed = true; + } + if(sendCloseMessage) { + listenerRegistrationActor.tell(new + CloseDataChangeListenerRegistration().toSerializable(), null); + } + dataChangeListenerActor.tell(PoisonPill.getInstance(), null); } }