2020-06-24 01:19:22 +02:00
|
|
|
package org.warp.commonutils.concurrency.future;
|
|
|
|
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
import java.util.concurrent.locks.StampedLock;
|
|
|
|
import java.util.function.Supplier;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
import org.warp.commonutils.functional.IOSupplier;
|
|
|
|
|
|
|
|
public class FutureLockUtils {
|
|
|
|
|
|
|
|
public static <T> CompletableFuture<T> readLock(@Nullable StampedLock lock, @NotNull Supplier<CompletableFuture<T>> r) {
|
|
|
|
long lockValue;
|
|
|
|
if (lock != null) {
|
|
|
|
lockValue = lock.readLock();
|
|
|
|
} else {
|
|
|
|
lockValue = 0;
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
return CompletableFutureUtils.getCompletableFuture(r).whenComplete((result, err) -> {
|
2020-06-24 01:19:22 +02:00
|
|
|
if (lock != null) {
|
|
|
|
lock.unlockRead(lockValue);
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
});
|
2020-06-24 01:19:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static <T> CompletableFuture<T> writeLock(@Nullable StampedLock lock, @NotNull Supplier<CompletableFuture<T>> r) {
|
|
|
|
long lockValue;
|
|
|
|
if (lock != null) {
|
|
|
|
lockValue = lock.writeLock();
|
|
|
|
} else {
|
|
|
|
lockValue = 0;
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
return CompletableFutureUtils.getCompletableFuture(r).whenComplete((result, err) -> {
|
2020-06-24 01:19:22 +02:00
|
|
|
if (lock != null) {
|
|
|
|
lock.unlockWrite(lockValue);
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
});
|
2020-06-24 01:19:22 +02:00
|
|
|
}
|
|
|
|
|
2020-08-27 16:56:54 +02:00
|
|
|
public static <T> CompletableFuture<T> readLockIO(@Nullable StampedLock lock, @NotNull IOSupplier<CompletableFuture<T>> r) {
|
2020-06-24 01:19:22 +02:00
|
|
|
long lockValue;
|
|
|
|
if (lock != null) {
|
|
|
|
lockValue = lock.readLock();
|
|
|
|
} else {
|
|
|
|
lockValue = 0;
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
return CompletableFutureUtils.getCompletableFutureIO(r).whenComplete((result, err) -> {
|
2020-06-24 01:19:22 +02:00
|
|
|
if (lock != null) {
|
|
|
|
lock.unlockRead(lockValue);
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
});
|
2020-06-24 01:19:22 +02:00
|
|
|
}
|
|
|
|
|
2020-08-27 16:56:54 +02:00
|
|
|
public static <T> CompletableFuture<T> writeLockIO(@Nullable StampedLock lock, @NotNull IOSupplier<CompletableFuture<T>> r) {
|
2020-06-24 01:19:22 +02:00
|
|
|
long lockValue;
|
|
|
|
if (lock != null) {
|
|
|
|
lockValue = lock.writeLock();
|
|
|
|
} else {
|
|
|
|
lockValue = 0;
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
return CompletableFutureUtils.getCompletableFutureIO(r).whenComplete((result, err) -> {
|
2020-06-24 01:19:22 +02:00
|
|
|
if (lock != null) {
|
|
|
|
lock.unlockWrite(lockValue);
|
|
|
|
}
|
2020-08-27 16:56:54 +02:00
|
|
|
});
|
2020-06-24 01:19:22 +02:00
|
|
|
}
|
|
|
|
}
|