summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2012-06-20 03:09:50 +0200
committerSven Gothel <[email protected]>2012-06-20 03:09:50 +0200
commitbf4d413ea185e857de534913c556f00435ba9f21 (patch)
tree3770b9b436d64c11ad4b77c80ca680204f98da26
parent05024570dbf5fce08fa8ff081cb696f0fc4b7f95 (diff)
Fix TempFileCache/LauncherTempFileCache (regression commit: 1468286bf569a493e4fdb887d5f3732f88c8cec3) 'update' scenario in same JVM instance.v2.0-rc9
TempFileCache/LauncherTempFileCache were using the system property 'jnlp.jogamp.tmp.cache.root', if set. However, in case one JVM launched an old GlueGen (Applet) and then launching a new GlueGen (Applet) w/ a new tmpDir location, the property is still set but the tmpRootDir location does not exist. This patch tolerates this situation and cont. setting a new tmpRootDir. Example: JVM1.GlueGen1 tmpDir: /tmp/, tmpRootDir: /tmp/jogamp.tmp.cache_000000/ JVM1.GlueGen2 tmpDir: /tmp/jogamp_0000/, tmpRootDir: /tmp/jogamp_0000/file_cache/ Misc: - IOUtil: Always use 'jogamp_xxxx' as the sys-temp subfolder for tmpDir - JNILibLoaderBase: Remove unised import - TempJarCache.validateCertificates(): Add OK DEBUG output.
-rw-r--r--src/java/com/jogamp/common/jvm/JNILibLoaderBase.java1
-rw-r--r--src/java/com/jogamp/common/util/IOUtil.java10
-rw-r--r--src/java/com/jogamp/common/util/cache/TempFileCache.java64
-rw-r--r--src/java/com/jogamp/common/util/cache/TempJarCache.java7
-rw-r--r--src/java/jogamp/android/launcher/LauncherTempFileCache.java51
5 files changed, 79 insertions, 54 deletions
diff --git a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
index 32f5101..60f3060 100644
--- a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
+++ b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
@@ -47,7 +47,6 @@ import java.security.PrivilegedAction;
import java.util.HashSet;
import com.jogamp.common.os.NativeLibrary;
-import com.jogamp.common.os.Platform;
import com.jogamp.common.util.JarUtil;
import com.jogamp.common.util.PropertyAccess;
import com.jogamp.common.util.cache.TempJarCache;
diff --git a/src/java/com/jogamp/common/util/IOUtil.java b/src/java/com/jogamp/common/util/IOUtil.java
index 19ae683..09094bf 100644
--- a/src/java/com/jogamp/common/util/IOUtil.java
+++ b/src/java/com/jogamp/common/util/IOUtil.java
@@ -773,9 +773,8 @@ public class IOUtil {
/**
* This methods finds [and creates] an available temporary sub-directory:
* <pre>
- File tmpBaseDir;
+ File tmpBaseDir = null;
if(null != testDir(tmpRoot, true, executable)) { // check tmpRoot first
- tmpBaseDir = testDir(new File(tmpRoot, tmpSubDirPrefix), true, executable);
for(int i = 0; null == tmpBaseDir && i<=9999; i++) {
final String tmpDirSuffix = String.format("_%04d", i); // 4 digits for iteration
tmpBaseDir = testDir(new File(tmpRoot, tmpSubDirPrefix+tmpDirSuffix), true, executable);
@@ -797,9 +796,8 @@ public class IOUtil {
private static File getSubTempDir(File tmpRoot, String tmpSubDirPrefix, boolean executable)
throws SecurityException
{
- File tmpBaseDir;
+ File tmpBaseDir = null;
if(null != testDirImpl(tmpRoot, true /* create */, executable)) { // check tmpRoot first
- tmpBaseDir = testDirImpl(new File(tmpRoot, tmpSubDirPrefix), true /* create */, executable);
for(int i = 0; null == tmpBaseDir && i<=9999; i++) {
final String tmpDirSuffix = String.format("_%04d", i); // 4 digits for iteration
tmpBaseDir = testDirImpl(new File(tmpRoot, tmpSubDirPrefix+tmpDirSuffix), true /* create */, executable);
@@ -897,7 +895,7 @@ public class IOUtil {
/**
* Returns a platform independent writable directory for temporary files
* consisting of the platform's {@code temp-root} + {@link #tmpSubDir},
- * e.g. {@code /tmp/jogamp/}.
+ * e.g. {@code /tmp/jogamp_0000/}.
* <p>
* On standard Java the {@code temp-root} folder is specified by <code>java.io.tempdir</code>.
* </p>
@@ -911,7 +909,7 @@ public class IOUtil {
* </p>
* <p>
* In case {@code temp-root} is the users home folder,
- * a dot is being prepended to {@link #tmpSubDir}, i.e.: {@code /home/user/.jogamp/}.
+ * a dot is being prepended to {@link #tmpSubDir}, i.e.: {@code /home/user/.jogamp_0000/}.
* </p>
* @param executable true if the user intents to launch executables from the temporary directory, otherwise false.
* @param acc The security {@link AccessControlContext} to access properties, environment vars, create directories and test <i>executability</i>
diff --git a/src/java/com/jogamp/common/util/cache/TempFileCache.java b/src/java/com/jogamp/common/util/cache/TempFileCache.java
index 7eebbd0..755ed7b 100644
--- a/src/java/com/jogamp/common/util/cache/TempFileCache.java
+++ b/src/java/com/jogamp/common/util/cache/TempFileCache.java
@@ -132,17 +132,19 @@ public class TempFileCache {
* system property.
*
* a. If set, then some other thread in a different ClassLoader has
- * already created the tmprootdir, so we just need to
+ * already created the tmpRootDir, so we just need to
* use it. The remaining steps are skipped.
+ * However, we check the existence of the tmpRootDir
+ * and if non existent, we assume a new launch and continue.
*
* b. If not set, then we are the first thread in this JVM to run,
- * and we need to create the the tmprootdir.
+ * and we need to create the the tmpRootDir.
*
- * 3. Create the tmprootdir, along with the appropriate locks.
+ * 3. Create the tmpRootDir, along with the appropriate locks.
* Note that we perform the operations in the following order,
- * prior to creating tmprootdir itself, to work around the fact that
+ * prior to creating tmpRootDir itself, to work around the fact that
* the file creation and file lock steps are not atomic, and we need
- * to ensure that a newly-created tmprootdir isn't reaped by a
+ * to ensure that a newly-created tmpRootDir isn't reaped by a
* concurrently running JVM.
*
* create jlnNNNN.tmp using File.createTempFile()
@@ -170,6 +172,36 @@ public class TempFileCache {
private static void initTmpRoot() throws IOException {
tmpRootPropValue = System.getProperty(tmpRootPropName);
+ if (tmpRootPropValue != null) {
+ // Make sure that the property is not set to an illegal value
+ if (tmpRootPropValue.indexOf('/') >= 0 ||
+ tmpRootPropValue.indexOf(File.separatorChar) >= 0) {
+ throw new IOException("Illegal value of: " + tmpRootPropName);
+ }
+
+ // Set tmpRootDir = ${tmpbase}/${jnlp.applet.launcher.tmproot}
+ if (DEBUG) {
+ System.err.println("TempFileCache: Trying existing value of: " +
+ tmpRootPropName + "=" + tmpRootPropValue);
+ }
+ tmpRootDir = new File(tmpBaseDir, tmpRootPropValue);
+ if (DEBUG) {
+ System.err.println("TempFileCache: Trying tmpRootDir = " + tmpRootDir.getAbsolutePath());
+ }
+ if (tmpRootDir.isDirectory()) {
+ if (!tmpRootDir.canWrite()) {
+ throw new IOException("Temp root directory is not writable: " + tmpRootDir.getAbsolutePath());
+ }
+ } else {
+ // It is possible to move to a new GlueGen version within the same JVM
+ // In case tmpBaseDir has changed, we should assume a new tmpRootDir.
+ System.err.println("TempFileCache: None existing tmpRootDir = " + tmpRootDir.getAbsolutePath()+", assuming new path due to update");
+ tmpRootPropValue = null;
+ tmpRootDir = null;
+ System.clearProperty(tmpRootPropName);
+ }
+ }
+
if (tmpRootPropValue == null) {
// Create ${tmpbase}/jlnNNNN.tmp then lock the file
File tmpFile = File.createTempFile("jln", ".tmp", tmpBaseDir);
@@ -241,28 +273,6 @@ public class TempFileCache {
};
reaperThread.setName("TempFileCache-Reaper");
reaperThread.start();
- } else {
- // Make sure that the property is not set to an illegal value
- if (tmpRootPropValue.indexOf('/') >= 0 ||
- tmpRootPropValue.indexOf(File.separatorChar) >= 0) {
- throw new IOException("Illegal value of: " + tmpRootPropName);
- }
-
- // Set tmpRootDir = ${tmpbase}/${jnlp.applet.launcher.tmproot}
- if (DEBUG) {
- System.err.println("TempFileCache: Using existing value of: " +
- tmpRootPropName + "=" + tmpRootPropValue);
- }
- tmpRootDir = new File(tmpBaseDir, tmpRootPropValue);
- if (DEBUG) {
- System.err.println("TempFileCache: tmpRootDir = " + tmpRootDir.getAbsolutePath());
- }
- if (!tmpRootDir.isDirectory()) {
- throw new IOException("Temp root directory does not exist: " + tmpRootDir.getAbsolutePath());
- }
- if (!tmpRootDir.canWrite()) {
- throw new IOException("Temp root directory is not writable: " + tmpRootDir.getAbsolutePath());
- }
}
}
diff --git a/src/java/com/jogamp/common/util/cache/TempJarCache.java b/src/java/com/jogamp/common/util/cache/TempJarCache.java
index 8aaab94..e4a77fe 100644
--- a/src/java/com/jogamp/common/util/cache/TempJarCache.java
+++ b/src/java/com/jogamp/common/util/cache/TempJarCache.java
@@ -411,6 +411,11 @@ public class TempJarCache {
// In case one tries to run uncertified JARs, the wrapping applet/JNLP
// SecurityManager will kick in and throw a SecurityException.
JarUtil.validateCertificates(rootCerts, jarFile);
- }
+ if(DEBUG) {
+ System.err.println("TempJarCache: validateCertificates: OK - Matching rootCerts in given class "+certClass.getName()+", nativeJar "+jarFile.getName());
+ }
+ } else if(DEBUG) {
+ System.err.println("TempJarCache: validateCertificates: OK - No rootCerts in given class "+certClass.getName()+", nativeJar "+jarFile.getName());
+ }
}
}
diff --git a/src/java/jogamp/android/launcher/LauncherTempFileCache.java b/src/java/jogamp/android/launcher/LauncherTempFileCache.java
index 7e566c9..c7b9ad0 100644
--- a/src/java/jogamp/android/launcher/LauncherTempFileCache.java
+++ b/src/java/jogamp/android/launcher/LauncherTempFileCache.java
@@ -101,6 +101,8 @@ public class LauncherTempFileCache {
* a. If set, then some other thread in a different ClassLoader has
* already created the tmprootdir, so we just need to
* use it. The remaining steps are skipped.
+ * However, we check the existence of the tmpRootDir
+ * and if non existent, we assume a new launch and continue.
*
* b. If not set, then we are the first thread in this JVM to run,
* and we need to create the the tmprootdir.
@@ -148,6 +150,36 @@ public class LauncherTempFileCache {
}
tmpRootPropValue = System.getProperty(tmpRootPropName);
+ if (tmpRootPropValue != null) {
+ // Make sure that the property is not set to an illegal value
+ if (tmpRootPropValue.indexOf('/') >= 0 ||
+ tmpRootPropValue.indexOf(File.separatorChar) >= 0) {
+ throw new IOException("Illegal value of: " + tmpRootPropName);
+ }
+
+ // Set tmpRootDir = ${tmpbase}/${jnlp.applet.launcher.tmproot}
+ if (DEBUG) {
+ System.err.println("TempFileCache: Trying existing value of: " +
+ tmpRootPropName + "=" + tmpRootPropValue);
+ }
+ tmpRootDir = new File(tmpBaseDir, tmpRootPropValue);
+ if (DEBUG) {
+ System.err.println("TempFileCache: Trying tmpRootDir = " + tmpRootDir.getAbsolutePath());
+ }
+ if (tmpRootDir.isDirectory()) {
+ if (!tmpRootDir.canWrite()) {
+ throw new IOException("Temp root directory is not writable: " + tmpRootDir.getAbsolutePath());
+ }
+ } else {
+ // It is possible to move to a new GlueGen version within the same JVM
+ // In case tmpBaseDir has changed, we should assume a new tmpRootDir.
+ System.err.println("TempFileCache: None existing tmpRootDir = " + tmpRootDir.getAbsolutePath()+", assuming new path due to update");
+ tmpRootPropValue = null;
+ tmpRootDir = null;
+ System.clearProperty(tmpRootPropName);
+ }
+ }
+
if (tmpRootPropValue == null) {
// Create the tmpbase directory if it doesn't already exist
tmpBaseDir.mkdirs();
@@ -225,25 +257,6 @@ public class LauncherTempFileCache {
};
reaperThread.setName("TempFileCache-Reaper");
reaperThread.start();
- } else {
- // Make sure that the property is not set to an illegal value
- if (tmpRootPropValue.indexOf('/') >= 0 ||
- tmpRootPropValue.indexOf(File.separatorChar) >= 0) {
- throw new IOException("Illegal value of: " + tmpRootPropName);
- }
-
- // Set tmpRootDir = ${tmpbase}/${jnlp.applet.launcher.tmproot}
- if (DEBUG) {
- System.err.println("TempFileCache: Using existing value of: " +
- tmpRootPropName + "=" + tmpRootPropValue);
- }
- tmpRootDir = new File(tmpBaseDir, tmpRootPropValue);
- if (DEBUG) {
- System.err.println("TempFileCache: tmpRootDir = " + tmpRootDir.getAbsolutePath());
- }
- if (!tmpRootDir.isDirectory()) {
- throw new IOException("Cannot access " + tmpRootDir);
- }
}
}
if (DEBUG) {