discord-jadx/app/src/main/java/androidx/room/util/CopyLock.java

66 lines
2.0 KiB
Java

package androidx.room.util;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import c.d.b.a.a;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
public class CopyLock {
private static final Map<String, Lock> sThreadLocks = new HashMap();
private final File mCopyLockFile;
private final boolean mFileLevelLock;
private FileChannel mLockChannel;
private final Lock mThreadLock;
public CopyLock(@NonNull String str, @NonNull File file, boolean z2) {
File file2 = new File(file, a.t(str, ".lck"));
this.mCopyLockFile = file2;
this.mThreadLock = getThreadLock(file2.getAbsolutePath());
this.mFileLevelLock = z2;
}
private static Lock getThreadLock(String str) {
Lock lock;
Map<String, Lock> map = sThreadLocks;
synchronized (map) {
lock = map.get(str);
if (lock == null) {
lock = new ReentrantLock();
map.put(str, lock);
}
}
return lock;
}
public void lock() {
this.mThreadLock.lock();
if (this.mFileLevelLock) {
try {
FileChannel channel = new FileOutputStream(this.mCopyLockFile).getChannel();
this.mLockChannel = channel;
channel.lock();
} catch (IOException e) {
throw new IllegalStateException("Unable to grab copy lock.", e);
}
}
}
public void unlock() {
FileChannel fileChannel = this.mLockChannel;
if (fileChannel != null) {
try {
fileChannel.close();
} catch (IOException unused) {
}
}
this.mThreadLock.unlock();
}
}