summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorValerij Fredriksen <valerijf@oath.com>2017-09-25 09:22:42 +0200
committerValerij Fredriksen <valerijf@oath.com>2017-09-25 09:22:42 +0200
commit251c995c48b55021613865297b6c355456863a07 (patch)
tree16e76f9fb307ef423b0ad789619be92a7a44f90c /vespajlib
parenta8d6f5c76bb7e9b18bcc16f6dd8f4e9b09d2ba4f (diff)
Create ClassLocking
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java19
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java37
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java5
3 files changed, 61 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java
new file mode 100644
index 00000000000..2a3c70d31d2
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLock.java
@@ -0,0 +1,19 @@
+package com.yahoo.concurrent.classlock;
+
+/**
+ * @author valerijf
+ */
+public class ClassLock implements AutoCloseable {
+ private final Class<?> clazz;
+ private final ClassLocking classLocking;
+
+ ClassLock(ClassLocking classLocking, Class<?> clazz) {
+ this.classLocking = classLocking;
+ this.clazz = clazz;
+ }
+
+ @Override
+ public void close() {
+ classLocking.unlock(clazz, this);
+ }
+}
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java
new file mode 100644
index 00000000000..8014148cc30
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/ClassLocking.java
@@ -0,0 +1,37 @@
+package com.yahoo.concurrent.classlock;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author valerijf
+ */
+public class ClassLocking {
+ private final Map<Class<?>, ClassLock> classLocks = new HashMap<>();
+ private final Object monitor = new Object();
+
+ public ClassLock lock(Class<?> clazz) {
+ synchronized (monitor) {
+ while(classLocks.containsKey(clazz)) {
+ try {
+ monitor.wait();
+ } catch (InterruptedException ignored) { }
+ }
+
+ ClassLock classLock = new ClassLock(this, clazz);
+ classLocks.put(clazz, classLock);
+ return classLock;
+ }
+ }
+
+ void unlock(Class<?> clazz, ClassLock classLock) {
+ synchronized (monitor) {
+ if (classLock.equals(classLocks.get(clazz))) {
+ classLocks.remove(clazz);
+ monitor.notifyAll();
+ } else {
+ throw new IllegalArgumentException("Lock has already been released");
+ }
+ }
+ }
+}
diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java
new file mode 100644
index 00000000000..010af471f03
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/concurrent/classlock/package-info.java
@@ -0,0 +1,5 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+@ExportPackage
+package com.yahoo.concurrent.classlock;
+
+import com.yahoo.osgi.annotation.ExportPackage;