1 package org.metricshub.wmi;
2
3 /*-
4 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
5 * WMI Java Client
6 * ჻჻჻჻჻჻
7 * Copyright (C) 2023 - 2025 MetricsHub
8 * ჻჻჻჻჻჻
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
21 */
22
23 import java.util.concurrent.locks.ReentrantReadWriteLock;
24
25 /**
26 * Auto-closeable version of {@link ReentrantReadWriteLock}
27 * <p>
28 * Example:
29 * <pre><code>
30 * AutoCloseableReadWriteLock rwLock = new AutoCloseableReadWriteLock();
31 *
32 * try (AutoCloseableReadWriteLock.AutoCloseableReadLock readLock = rwLock.read()) {
33 * // Do things that do not require exclusive access
34 * }
35 * // Read lock (non-exclusive) is unlocked automatically here
36 *
37 * try (AutoCloseableReadWriteLock.AutoCloseableWriteLock writeLock = rwLock.write()) {
38 * // Do things that require exclusive access
39 * }
40 * // Lock is unlocked automatically here
41 * </code></pre>
42 *
43 */
44 public class AutoCloseableReadWriteLock extends ReentrantReadWriteLock {
45
46 private static final long serialVersionUID = 1L;
47
48 /**
49 * Constructs a new AutoCloseableReadWriteLock.
50 */
51 public AutoCloseableReadWriteLock() {
52 super();
53 }
54
55 /**
56 * Locks the "read lock" of the {@link ReentrantReadWriteLock}. Use this to enter
57 * a section of the code that doesn't require exclusive access.
58 * @return An auto-closeable lock, to be used in a try-with-resource block
59 */
60 public AutoCloseableReadLock read() {
61 return new AutoCloseableReadLock(this.readLock());
62 }
63
64 /**
65 * Locks the "write lock" of the {@link ReentrantReadWriteLock}. Use this to enter
66 * a section of the code that requires exclusive access.
67 * @return An auto-closeable lock, to be used in a try-with-resource block
68 */
69 public AutoCloseableWriteLock write() {
70 return new AutoCloseableWriteLock(this.writeLock());
71 }
72
73 /**
74 * Auto-closeable version of {@link ReadLock}
75 */
76 public static class AutoCloseableReadLock implements AutoCloseable {
77
78 final ReadLock readLock;
79
80 protected AutoCloseableReadLock(ReadLock lock) {
81 readLock = lock;
82 readLock.lock();
83 }
84
85 @Override
86 public void close() {
87 readLock.unlock();
88 }
89 }
90
91 /**
92 * Auto-closeable version of {@link WriteLock}
93 */
94 public static class AutoCloseableWriteLock implements AutoCloseable {
95
96 final WriteLock writeLock;
97
98 protected AutoCloseableWriteLock(WriteLock lock) {
99 writeLock = lock;
100 writeLock.lock();
101 }
102
103 @Override
104 public void close() {
105 writeLock.unlock();
106 }
107 }
108 }