/** * Copyright 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package jogamp.common.util.locks; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileLock; import com.jogamp.common.util.locks.SingletonInstance; public class SingletonInstanceFileLock extends SingletonInstance { static final String temp_file_path; static { String s = null; try { File tmpFile = File.createTempFile("TEST", "tst"); String absTmpFile = tmpFile.getCanonicalPath(); tmpFile.delete(); s = absTmpFile.substring(0, absTmpFile.lastIndexOf(File.separator)); } catch (IOException ex) { ex.printStackTrace(); } temp_file_path = s; } public static String getCanonicalTempPath() { return temp_file_path; } public static String getCanonicalTempLockFilePath(String basename) { return getCanonicalTempPath() + File.separator + basename; } public SingletonInstanceFileLock(long poll_ms, String lockFileBasename) { super(poll_ms); file = new File ( getCanonicalTempLockFilePath ( lockFileBasename ) ); setupFileCleanup(); } public SingletonInstanceFileLock(long poll_ms, File lockFile) { super(poll_ms); file = lockFile ; setupFileCleanup(); } @Override public final String getName() { return file.getPath(); } private void setupFileCleanup() { file.deleteOnExit(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { if(isLocked()) { System.err.println(infoPrefix()+" XXX "+SingletonInstanceFileLock.this.getName()+" - Unlock @ JVM Shutdown"); } unlock(); } }); } @Override protected boolean tryLockImpl() { try { randomAccessFile = new RandomAccessFile(file, "rw"); fileLock = randomAccessFile.getChannel().tryLock(); if (fileLock != null) { return true; } } catch (Exception e) { System.err.println(infoPrefix()+" III "+getName()+" - Unable to create and/or lock file"); e.printStackTrace(); } return false; } @Override protected boolean unlockImpl() { try { if(null != fileLock) { fileLock.release(); fileLock = null; } if(null != randomAccessFile) { randomAccessFile.close(); randomAccessFile = null; } if(null != file) { file.delete(); } return true; } catch (Exception e) { System.err.println(infoPrefix()+" EEE "+getName()+" - Unable to remove lock file"); e.printStackTrace(); } finally { fileLock = null; randomAccessFile = null; } return false; } private final File file; private RandomAccessFile randomAccessFile = null; private FileLock fileLock = null; } > html public "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta http-equiv="CONTENT-TYPE" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.75 [en] (X11; U; Linux 2.4.0-test4 i686) [Netscape]"> <meta name="CREATED" content="20000807;19074400"> <meta name="CHANGED" content="16010101;0"> </head> <body text="#000000" bgcolor="#E6E6FF" link="#0000EF" vlink="#51188E" alink="#FF0000"> <center> <h1> <font size=+4><a href="http://www.jausoft.com/gl4java/"> OpenGL<SUP><FONT SIZE="1">TM</FONT></SUP> for Java<SUP><FONT SIZE="1">TM</FONT></SUP> </a> / Docs</font></h1></center> <center><font size=+1>OpenGL Language Mapping For Java</font> <p><br> <p><font size=+1><a href="./overview/index.html">Overview</a></font> <br><font size=+1><a href="./html/GL4Java.html">Manual</a></font> <br><font size=+1><a href="./html/index.html">API</a></font> <br><font size=+1><a href="./thanxs.html">Thanxs</a></font> <br> <br><font size=+1><a href="./trademarks.html">Trademarks</a></font> <br> <br><font size=+1><a href="../demos/MiscDemos/PerformanceLogs/">Performance Measurement Log-Files</a></font> <p><br> <br><font size=+1>Other Documentation</font> <br> <br><font size=+1><A HREF="http://romka.demonews.com/opengl/doc/opengl_java_eng.htm">Using OpenGL in Java by Roman Podobedov</A></FONT> <br> <p><a href="http://www.gnu.org"><img SRC="images/gleeson_head.png" NAME="Graphic1" BORDER=0 height=146 width=207 align=BOTTOM></a> <p><a href="http://www.gnu.org/copyleft/lgpl.html">GL4Java is licensed under the ´GNU Library General Public License (LGPL)´ !</a> <br> <br> <br> <p><font size=+1>We're hosted on </font> <p><a href="http://sourceforge.net"> <IMG src="http://sourceforge.net/sflogo.php?group_id=602&type=1" width="88" height="31" border="0" alt="SourceForge Logo"></A> <br> <br> <br> <p><a href="http://www.jausoft.com"><img SRC="images/jaulogo-hp-300x80.png" NOSAVE BORDER=0 height=80 width=300></a> <ul> </ul> </body> </html>