From cf08f243d0984aad331fa5773c5e0f2a01643fea Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Mon, 25 Jul 2011 00:12:07 -0500 Subject: [PATCH] Modify ImageIO use to avoid re-encoding on retry, do better buffering --- .../org/dynmap/utils/FileLockManager.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/dynmap/utils/FileLockManager.java b/src/main/java/org/dynmap/utils/FileLockManager.java index b7c3c600..0e1b5b44 100644 --- a/src/main/java/org/dynmap/utils/FileLockManager.java +++ b/src/main/java/org/dynmap/utils/FileLockManager.java @@ -1,12 +1,16 @@ package org.dynmap.utils; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.RandomAccessFile; import java.util.HashMap; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import org.dynmap.Log; +import org.dynmap.debug.Debug; /** * Implements soft-locks for prevent concurrency issues with file updates */ @@ -129,20 +133,30 @@ public class FileLockManager { //Log.info("releaseReadLock(" + f + ")"); } private static final int MAX_WRITE_RETRIES = 6; + + private static ByteArrayOutputStream baos = new ByteArrayOutputStream(); + private static Object baos_lock = new Object(); /** * Wrapper for IOImage.write - implements retries for busy files */ public static void imageIOWrite(BufferedImage img, String type, File fname) throws IOException { int retrycnt = 0; boolean done = false; - + byte[] rslt; + synchronized(baos_lock) { + baos.reset(); + ImageIO.write(img, type, baos); /* Write to byte array stream - prevent bogus I/O errors */ + rslt = baos.toByteArray(); + } while(!done) { + RandomAccessFile f = null; try { - ImageIO.write(img, type, fname); + f = new RandomAccessFile(fname, "rw"); + f.write(rslt); done = true; } catch (IOException fnfx) { if(retrycnt < MAX_WRITE_RETRIES) { - Log.info("Image file " + fname.getPath() + " - unable to write - retry #" + retrycnt); + Debug.debug("Image file " + fname.getPath() + " - unable to write - retry #" + retrycnt); try { Thread.sleep(50 << retrycnt); } catch (InterruptedException ix) { throw fnfx; } retrycnt++; } @@ -150,6 +164,10 @@ public class FileLockManager { Log.info("Image file " + fname.getPath() + " - unable to write - failed"); throw fnfx; } + } finally { + if(f != null) { + try { f.close(); } catch (IOException iox) {} + } } } }