aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/concurrent
diff options
context:
space:
mode:
authorGravatar Eric Fellheimer <felly@google.com>2015-09-03 00:20:53 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-03 09:04:47 +0000
commit58109c3b23a87aa6f567486e8c267f98f0334449 (patch)
tree0216f5ecfa298262684cdb1ad58088806cf43698 /src/main/java/com/google/devtools/build/lib/concurrent
parent18742ad31d29625f6dd65b697054c72153b62517 (diff)
Add a new KeyedLocker, StripedKeyedLocker. This new implementation simply stores a striped set of reentrant locks.
-- MOS_MIGRATED_REVID=102198213
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/concurrent')
-rw-r--r--src/main/java/com/google/devtools/build/lib/concurrent/RefCountedMultisetKeyedLocker.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/concurrent/StripedKeyedLocker.java50
2 files changed, 50 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/RefCountedMultisetKeyedLocker.java b/src/main/java/com/google/devtools/build/lib/concurrent/RefCountedMultisetKeyedLocker.java
index 52109ad543..64d530e617 100644
--- a/src/main/java/com/google/devtools/build/lib/concurrent/RefCountedMultisetKeyedLocker.java
+++ b/src/main/java/com/google/devtools/build/lib/concurrent/RefCountedMultisetKeyedLocker.java
@@ -60,11 +60,6 @@ public class RefCountedMultisetKeyedLocker<K> implements KeyedLocker<K> {
+ "AutoUnlocker instance", key);
throw new IllegalUnlockException(msg);
}
- if (!lock.isHeldByCurrentThread()) {
- String msg = String.format("For key %s, the calling thread to 'close' must be the one "
- + "that acquired the AutoUnlocker", key);
- throw new IllegalUnlockException(msg);
- }
try {
Lock waitersLock = waitersLocks.get(key);
try {
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/StripedKeyedLocker.java b/src/main/java/com/google/devtools/build/lib/concurrent/StripedKeyedLocker.java
new file mode 100644
index 0000000000..505ea6c195
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/concurrent/StripedKeyedLocker.java
@@ -0,0 +1,50 @@
+// Copyright 2015 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.concurrent;
+
+import com.google.common.util.concurrent.Striped;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.Lock;
+
+/**
+ * An implementation of {@link KeyedLocker} backed by a {@link Striped}.
+ */
+public class StripedKeyedLocker<K> implements KeyedLocker<K> {
+
+ private final Striped<Lock> locks;
+
+ public StripedKeyedLocker(int stripes) {
+ locks = Striped.lock(stripes);
+ }
+
+ @Override
+ public AutoUnlocker lock(final K key) {
+ final Lock lock = locks.get(key);
+ lock.lock();
+ return new AutoUnlocker() {
+ private final AtomicBoolean closeCalled = new AtomicBoolean(false);
+
+ @Override
+ public void close() {
+ if (closeCalled.getAndSet(true)) {
+ String msg = String.format("For key %s, 'close' can be called at most once per "
+ + "AutoUnlocker instance", key);
+ throw new IllegalUnlockException(msg);
+ }
+ lock.unlock();
+ }
+ };
+ }
+}