BUG-1886: eliminate sychronized blocks 26/11226/1
authorRobert Varga <rovarga@cisco.com>
Mon, 15 Sep 2014 13:22:13 +0000 (15:22 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 16 Sep 2014 10:10:52 +0000 (12:10 +0200)
The tree state is guarded by the read-write lock, so there is no need
for the additional, overly large, critical section. This allows empty
operations to complete completely lockfree.

Change-Id: Iee01f4745a4927e6dc5093252c15d7d4e3959e9a
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java

index b8344d896387f9cbc7c35ebf785f6a5d681bfaf8..76a2d90814537e9bd6c7c1d5d78ecab08fadea55 100644 (file)
@@ -45,7 +45,7 @@ final class InMemoryDataTree implements DataTree {
     }
 
     @Override
-    public synchronized void setSchemaContext(final SchemaContext newSchemaContext) {
+    public void setSchemaContext(final SchemaContext newSchemaContext) {
         Preconditions.checkNotNull(newSchemaContext);
 
         LOG.info("Attempting to install schema contexts");
@@ -82,13 +82,18 @@ final class InMemoryDataTree implements DataTree {
     @Override
     public void validate(final DataTreeModification modification) throws DataValidationFailedException {
         Preconditions.checkArgument(modification instanceof InMemoryDataTreeModification, "Invalid modification class %s", modification.getClass());
-
         final InMemoryDataTreeModification m = (InMemoryDataTreeModification)modification;
-        m.getStrategy().checkApplicable(PUBLIC_ROOT_PATH, m.getRootModification(), Optional.<TreeNode>of(rootNode));
+
+        rwLock.readLock().lock();
+        try {
+            m.getStrategy().checkApplicable(PUBLIC_ROOT_PATH, m.getRootModification(), Optional.<TreeNode>of(rootNode));
+        } finally {
+            rwLock.readLock().unlock();
+        }
     }
 
     @Override
-    public synchronized DataTreeCandidate prepare(final DataTreeModification modification) {
+    public DataTreeCandidate prepare(final DataTreeModification modification) {
         Preconditions.checkArgument(modification instanceof InMemoryDataTreeModification, "Invalid modification class %s", modification.getClass());
 
         final InMemoryDataTreeModification m = (InMemoryDataTreeModification)modification;
@@ -101,7 +106,7 @@ final class InMemoryDataTree implements DataTree {
         rwLock.writeLock().lock();
         try {
             final Optional<TreeNode> newRoot = m.getStrategy().apply(m.getRootModification(),
-                    Optional.<TreeNode>of(rootNode), m.getVersion());
+                Optional.<TreeNode>of(rootNode), m.getVersion());
             Preconditions.checkState(newRoot.isPresent(), "Apply strategy failed to produce root node");
             return new InMemoryDataTreeCandidate(PUBLIC_ROOT_PATH, root, rootNode, newRoot.get());
         } finally {
@@ -110,7 +115,7 @@ final class InMemoryDataTree implements DataTree {
     }
 
     @Override
-    public synchronized void commit(final DataTreeCandidate candidate) {
+    public void commit(final DataTreeCandidate candidate) {
         if (candidate instanceof NoopDataTreeCandidate) {
             return;
         }