Blame src/libbluray/bdj/java-j2se/org/videolan/LockFile.java

Packit 5e46da
/*
Packit 5e46da
 * This file is part of libbluray
Packit 5e46da
 * Copyright (C) 2014  Petri Hintukainen <phintuka@users.sourceforge.net>
Packit 5e46da
 *
Packit 5e46da
 * This library is free software; you can redistribute it and/or
Packit 5e46da
 * modify it under the terms of the GNU Lesser General Public
Packit 5e46da
 * License as published by the Free Software Foundation; either
Packit 5e46da
 * version 2.1 of the License, or (at your option) any later version.
Packit 5e46da
 *
Packit 5e46da
 * This library is distributed in the hope that it will be useful,
Packit 5e46da
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5e46da
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 5e46da
 * Lesser General Public License for more details.
Packit 5e46da
 *
Packit 5e46da
 * You should have received a copy of the GNU Lesser General Public
Packit 5e46da
 * License along with this library. If not, see
Packit 5e46da
 * <http://www.gnu.org/licenses/>.
Packit 5e46da
 */
Packit 5e46da
Packit 5e46da
package org.videolan;
Packit 5e46da
Packit 5e46da
import java.io.IOException;
Packit 5e46da
import java.io.RandomAccessFile;
Packit 5e46da
Packit 5e46da
class LockFile {
Packit 5e46da
Packit 5e46da
    private LockFile(RandomAccessFile lockFile) {
Packit 5e46da
        this.lockFile = lockFile;
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public static LockFile create(String path) {
Packit 5e46da
Packit 5e46da
        RandomAccessFile os = null;
Packit 5e46da
        try {
Packit 5e46da
            os = new RandomAccessFile(path, "rw");
Packit 5e46da
            if (os.getChannel().tryLock() != null) {
Packit 5e46da
                /* Test if locking works: second tryLock() should fail */
Packit 5e46da
                try {
Packit 5e46da
                    if (os.getChannel().tryLock() != null) {
Packit 5e46da
                        try {
Packit 5e46da
                            os.close();
Packit 5e46da
                        } catch (Exception e) {
Packit 5e46da
                        }
Packit 5e46da
                        logger.error("File locking is unreliable !");
Packit 5e46da
                        return null;
Packit 5e46da
                    }
Packit 5e46da
                } catch (Exception e) {
Packit 5e46da
                }
Packit 5e46da
                return new LockFile(os);
Packit 5e46da
            } else {
Packit 5e46da
                os.close();
Packit 5e46da
                logger.info("Failed locking " + path);
Packit 5e46da
            }
Packit 5e46da
        } catch (Exception e) {
Packit 5e46da
            if (os != null) {
Packit 5e46da
                try {
Packit 5e46da
                    os.close();
Packit 5e46da
                } catch (IOException e1) {
Packit 5e46da
                    e1.printStackTrace();
Packit 5e46da
                }
Packit 5e46da
            }
Packit 5e46da
            logger.error("Failed creating lock file: " + e);
Packit 5e46da
        }
Packit 5e46da
        return null;
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public void release() {
Packit 5e46da
        try {
Packit 5e46da
            if (lockFile != null) {
Packit 5e46da
                lockFile.close();
Packit 5e46da
            }
Packit 5e46da
        } catch (Exception e) {
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    private RandomAccessFile lockFile;
Packit 5e46da
Packit 5e46da
    private static final Logger logger = Logger.getLogger(LockFile.class.getName());
Packit 5e46da
}