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 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 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(); } }