66 lines
2.0 KiB
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();
|
|
}
|
|
}
|