/* * This file or a portion of this file is licensed under the terms of * the Globus Toolkit Public License, found in file ../GTPL, or at * http://www.globus.org/toolkit/download/license.html. This notice must * appear in redistributions of this file, with or without modification. * * Redistributions of this Software, with or without modification, must * reproduce the GTPL in: (1) the Software, or (2) the Documentation or * some other similar material which is provided with the Software (if * any). * * Copyright 1999-2004 University of Chicago and The University of * Southern California. All rights reserved. */ package org.griphyn.vdl.util; import org.griphyn.vdl.util.*; import java.util.*; import java.io.*; import java.nio.channels.*; /** * This class encapsulates the instance variables necessary to lock * a file. The NIO new locking methods are required. * * @author Jens-S. Vöckler * @author Yong Zhao * @version $Revision$ * * @see java.io.RandomAccessFile * @see java.nio.channels.FileChannel * @see java.nio.channels.FileLock */ public class FcntlLock { /** * For logging purposes, which file is it... */ private File m_file; /** * The random access file that remains open during lock operations. */ private RandomAccessFile m_channel; /** * One lock, covering the whole file, during the operation. */ private FileLock m_lock; /** * Create a file lock on the given file. * * @param f is the file name to lock. * @param rw is true for read/write mode, which will create missing * files. If false, read-only mode is used. * @param shared is true for shared locks, false for exclusive locks. * @throws FileNotFoundException if the file was not found * @throws IOException if the lock could not be acquired */ public FcntlLock( File f, boolean rw, boolean shared ) throws FileNotFoundException, IOException { Logging.instance().log( "lock", 2, "requesting " + ( shared ? "shared" : "exclusive" ) + " lock on " + f.getPath() ); m_file = f; m_channel = new RandomAccessFile( f, rw ? "rw" : "r" ); m_lock = m_channel.getChannel().lock( 0L, Long.MAX_VALUE, shared ); } /** * Release the file lock acquired with this instance. */ public void done() { if ( m_lock != null ) { Logging.instance().log( "lock", 2, "releasing lock on " + m_file.getPath() ); try { m_lock.release(); } catch ( IOException ioe ) { } m_lock = null; } if ( m_channel != null ) { try { m_channel.close(); } catch ( IOException ioe ) { } m_channel = null; } } /** * Releases all resource, if they were still active. */ protected void finalize() throws Throwable { done(); } }