250 lines
7.3 KiB
Java
250 lines
7.3 KiB
Java
/*
|
|
* Decompiled with CFR 0.152.
|
|
*/
|
|
package com.google.common.util.concurrent;
|
|
|
|
import com.google.common.annotations.Beta;
|
|
import com.google.common.base.Preconditions;
|
|
import java.util.concurrent.BlockingQueue;
|
|
import java.util.concurrent.CountDownLatch;
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.Semaphore;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeoutException;
|
|
|
|
@Beta
|
|
public final class Uninterruptibles {
|
|
public static void awaitUninterruptibly(CountDownLatch latch) {
|
|
boolean interrupted = false;
|
|
while (true) {
|
|
try {
|
|
latch.await();
|
|
return;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static boolean awaitUninterruptibly(CountDownLatch latch, long timeout, TimeUnit unit) {
|
|
boolean interrupted = false;
|
|
try {
|
|
long remainingNanos = unit.toNanos(timeout);
|
|
long end = System.nanoTime() + remainingNanos;
|
|
while (true) {
|
|
try {
|
|
boolean bl = latch.await(remainingNanos, TimeUnit.NANOSECONDS);
|
|
return bl;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
remainingNanos = end - System.nanoTime();
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void joinUninterruptibly(Thread toJoin) {
|
|
boolean interrupted = false;
|
|
while (true) {
|
|
try {
|
|
toJoin.join();
|
|
return;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static <V> V getUninterruptibly(Future<V> future) throws ExecutionException {
|
|
boolean interrupted = false;
|
|
while (true) {
|
|
try {
|
|
V v = future.get();
|
|
return v;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static <V> V getUninterruptibly(Future<V> future, long timeout, TimeUnit unit) throws ExecutionException, TimeoutException {
|
|
boolean interrupted = false;
|
|
try {
|
|
long remainingNanos = unit.toNanos(timeout);
|
|
long end = System.nanoTime() + remainingNanos;
|
|
while (true) {
|
|
V v;
|
|
try {
|
|
v = future.get(remainingNanos, TimeUnit.NANOSECONDS);
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
remainingNanos = end - System.nanoTime();
|
|
continue;
|
|
}
|
|
return v;
|
|
}
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void joinUninterruptibly(Thread toJoin, long timeout, TimeUnit unit) {
|
|
Preconditions.checkNotNull(toJoin);
|
|
boolean interrupted = false;
|
|
try {
|
|
long remainingNanos = unit.toNanos(timeout);
|
|
long end = System.nanoTime() + remainingNanos;
|
|
while (true) {
|
|
try {
|
|
TimeUnit.NANOSECONDS.timedJoin(toJoin, remainingNanos);
|
|
return;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
remainingNanos = end - System.nanoTime();
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static <E> E takeUninterruptibly(BlockingQueue<E> queue) {
|
|
boolean interrupted = false;
|
|
while (true) {
|
|
try {
|
|
E e = queue.take();
|
|
return e;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static <E> void putUninterruptibly(BlockingQueue<E> queue, E element) {
|
|
boolean interrupted = false;
|
|
while (true) {
|
|
try {
|
|
queue.put(element);
|
|
return;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void sleepUninterruptibly(long sleepFor, TimeUnit unit) {
|
|
boolean interrupted = false;
|
|
try {
|
|
long remainingNanos = unit.toNanos(sleepFor);
|
|
long end = System.nanoTime() + remainingNanos;
|
|
while (true) {
|
|
try {
|
|
TimeUnit.NANOSECONDS.sleep(remainingNanos);
|
|
return;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
remainingNanos = end - System.nanoTime();
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static boolean tryAcquireUninterruptibly(Semaphore semaphore, long timeout, TimeUnit unit) {
|
|
return Uninterruptibles.tryAcquireUninterruptibly(semaphore, 1, timeout, unit);
|
|
}
|
|
|
|
public static boolean tryAcquireUninterruptibly(Semaphore semaphore, int permits, long timeout, TimeUnit unit) {
|
|
boolean interrupted = false;
|
|
try {
|
|
long remainingNanos = unit.toNanos(timeout);
|
|
long end = System.nanoTime() + remainingNanos;
|
|
while (true) {
|
|
try {
|
|
boolean bl = semaphore.tryAcquire(permits, remainingNanos, TimeUnit.NANOSECONDS);
|
|
return bl;
|
|
}
|
|
catch (InterruptedException e) {
|
|
interrupted = true;
|
|
remainingNanos = end - System.nanoTime();
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
finally {
|
|
if (interrupted) {
|
|
Thread.currentThread().interrupt();
|
|
}
|
|
}
|
|
}
|
|
|
|
private Uninterruptibles() {
|
|
}
|
|
}
|