Revision: 6043 Author: [email protected] Date: Mon Aug 31 07:43:25 2009 Log: File.createTempFile() sometimes hangs on the build system while trying to get an exclusive lock on a temp file. This patch uses a custom method to create a temp file. Recommitting r6023.
Patch by: jlabanca Review by: fabbott http://code.google.com/p/google-web-toolkit/source/detail?r=6043 Modified: /trunk/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java ======================================= --- /trunk/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java Fri Aug 28 06:46:54 2009 +++ /trunk/build-tools/ant-gwt/src/com/google/gwt/ant/taskdefs/LatestTimeJar.java Mon Aug 31 07:43:25 2009 @@ -1,12 +1,12 @@ /* * Copyright 2008 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the @@ -28,12 +28,13 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Map; +import java.util.Random; import java.util.TreeMap; /** * A variation on Jar which handles duplicate entries by only archiving the most * recent of any given path. This is done by keeping a map of paths (as shown in - * the jar file) against {...@link #EntryInfo} objects identifying the input source + * the jar file) against {...@link EntryInfo} objects identifying the input source * and its timestamp. Most of the actual archiving is deferred until archive * finalization, when we've decided on the actual de-duplicated set of entries. */ @@ -54,7 +55,7 @@ /** * Called to actually add the entry to a given zip stream. - * + * * @param out * @param path * @throws IOException @@ -101,7 +102,7 @@ public FileEntryInfo(InputStream in, long lastModified, File fromArchive, int mode) throws IOException { super(lastModified, mode); - tmpFile = File.createTempFile("gwtjar", ""); + tmpFile = createTempFile("gwtjar", ""); tmpFile.deleteOnExit(); OutputStream fos = new FileOutputStream(tmpFile); int readLen = in.read(buffer); @@ -124,6 +125,54 @@ } } } + + /** + * Used to generate temporary file names. + */ + private static long counter = -1; + + /** + * Creates a temporary file. + * + * @param prefix the file prefix + * @param suffix the file suffix + * @return the new file + * @throws IOException if the file cannot be created + */ + private static File createTempFile(String prefix, String suffix) + throws IOException { + if (suffix == null) { + suffix = ".tmp"; + } + + // Get the temp file directory. + File tmpDir = new File(System.getProperty("java.io.tmpdir")); + tmpDir.mkdirs(); + + // Generate a random name. + if (counter == -1) { + counter = new Random().nextLong(); + } + boolean created = false; + File tmpFile; + do { + counter++; + tmpFile = new File(tmpDir, prefix + Long.toString(counter) + suffix); + if (!tmpFile.exists()) { + created = tmpFile.createNewFile(); + if (!created) { + // If we fail the create the temp file, it must have been created by + // another thread between lines 161 and 162. We re-seed to avoid + // further race conditions. + counter = new Random().nextLong(); + } + } + } while (!created); + + // Create the file. + tmpFile.createNewFile(); + return tmpFile; + } private byte buffer[] = new byte[16 * 1024]; private Map<String, EntryInfo> paths = new TreeMap<String, EntryInfo>(); @@ -188,10 +237,10 @@ /** * Checks whether an entry should be replaced, by touch dates and duplicates * setting. - * + * * @param path the path of an entry being considered * @param touchTime the lastModified of the candiate replacement - * @return + * @return true if the file should be replaced */ private boolean shouldReplace(String path, long touchTime) { EntryInfo oldInfo = paths.get(path); --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---
