Mike Kolesnik has uploaded a new change for review.

Change subject: engine: Added AutoCloseableLock
......................................................................

engine: Added AutoCloseableLock

This wrapper class will allow writing cleaner code, instead of:
lock.lock();
try {
    // Thread safe code
} finally {
    lock.unlock();
}

We can write:
try (AutoCloseableLock l = new AutoCloseableLock(lock)) {
    // Thread safe code
}

A follow-up patch will refactor code to use this new syntax and serve as
an example.

Change-Id: I3864d0e630c04f13e47e9f324414b308bd24290e
Signed-off-by: Mike Kolesnik <[email protected]>
---
A 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/AutoCloseableLock.java
A 
backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/AutoCloseableLockTest.java
2 files changed, 88 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/17/29617/1

diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/AutoCloseableLock.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/AutoCloseableLock.java
new file mode 100644
index 0000000..9e8b3fb
--- /dev/null
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/lock/AutoCloseableLock.java
@@ -0,0 +1,35 @@
+package org.ovirt.engine.core.utils.lock;
+
+import java.util.concurrent.locks.Lock;
+
+/**
+ * Wrapper for a {@link Lock} to make it auto closeable.<br>
+ * <br>
+ * Example:
+ *
+ * <pre>
+ * try (AutoCloseableLock l = new AutoCloseableLock(someLock)) {
+ *     // Thread safe code here
+ * }
+ * </pre>
+ */
+public final class AutoCloseableLock implements AutoCloseable {
+
+    private Lock lock;
+
+    /**
+     * Construct the {@link AutoCloseableLock} and lock the given lock.
+     *
+     * @param lock
+     *            The lock to acquire (and eventually release).
+     */
+    public AutoCloseableLock(Lock lock) {
+        this.lock = lock;
+        lock.lock();
+    }
+
+    @Override
+    public void close() {
+        lock.unlock();
+    }
+}
diff --git 
a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/AutoCloseableLockTest.java
 
b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/AutoCloseableLockTest.java
new file mode 100644
index 0000000..d68595f
--- /dev/null
+++ 
b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/lock/AutoCloseableLockTest.java
@@ -0,0 +1,53 @@
+package org.ovirt.engine.core.utils.lock;
+
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import java.util.concurrent.locks.Lock;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class AutoCloseableLockTest {
+
+    @Mock
+    Lock lock;
+
+    @Test
+    public void testLocking() {
+        try (AutoCloseableLock l = new AutoCloseableLock(lock)) {
+            // Do nothing with the lock..
+        }
+
+        verify(lock).unlock();
+    }
+
+    @Test
+    public void testExceptionInsideCodeBlock() {
+        try {
+            try (AutoCloseableLock l = new AutoCloseableLock(lock)) {
+                throw new RuntimeException();
+            }
+        } catch (RuntimeException e) {
+            verify(lock).unlock();
+            return;
+        }
+    }
+
+    @Test
+    public void testExceptionWhileLocking() {
+        doThrow(new RuntimeException()).when(lock).lock();
+        try (AutoCloseableLock l = new AutoCloseableLock(lock)) {
+            fail("Lock wasn't acquired, this code shouldn't happen.");
+        } catch (RuntimeException e) {
+            // No worry, we're good..
+        }
+
+        verify(lock, never()).unlock();
+    }
+}


-- 
To view, visit http://gerrit.ovirt.org/29617
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3864d0e630c04f13e47e9f324414b308bd24290e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Mike Kolesnik <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to