You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2016/06/15 04:17:13 UTC

commons-compress git commit: COMPRESS-357 - no longer invoke finish from finalize

Repository: commons-compress
Updated Branches:
  refs/heads/master abc2d2390 -> 2424036c2


COMPRESS-357 - no longer invoke finish from finalize


Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/2424036c
Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/2424036c
Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/2424036c

Branch: refs/heads/master
Commit: 2424036c286f0b3dfc280f00a1e835cb52e39375
Parents: abc2d23
Author: Stefan Bodewig <bo...@apache.org>
Authored: Wed Jun 15 06:16:39 2016 +0200
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Wed Jun 15 06:16:39 2016 +0200

----------------------------------------------------------------------
 src/changes/changes.xml                         | 21 ++++++++---
 .../bzip2/BZip2CompressorOutputStream.java      | 39 ++++++++++----------
 2 files changed, 36 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-compress/blob/2424036c/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index eb9bb00..fee6da3 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -43,7 +43,17 @@ The <action> type attribute can be add,update,fix,remove.
   </properties>
   <body>
     <release version="1.12" date="not released, yet"
-             description="Release 1.12 - API compatible to 1.11 but requires Java6 at runtime">
+             description="Release 1.12 - API compatible to 1.11 but requires Java6 at runtime.
+------------
+
+
+
+Release 1.12 changes the behavior of BZip2CompressorOutputStream's
+finalize method so that it no longer invokes finish. This is going to
+break code that relied on the finalizer to clean up an unfinished
+stream. The code will need to be changed to call finish or
+close itself.
+">
       <action issue="COMPRESS-349" type="update" date="2016-04-09" dev="ggregory">
         Update requirement from Java 5 to 6.
       </action>
@@ -75,10 +85,6 @@ The <action> type attribute can be add,update,fix,remove.
         Snappy used by the IWA files contained within the zip archives
         used in Apple's iWork 13 files.
       </action>
-      <action issue="COMPRESS-357" type="fix" date="2016-05-26">
-        BZip2CompressorOutputStream#finish is now synchronized to
-        avoid a race condition with the finalize method.
-      </action>
       <action issue="COMPRESS-351" type="update" date="2016-06-07">
         ZipArchiveInputStream and CpioArchiveInputStream could throw
         exceptions who's messages contained potentially corrupt entry
@@ -86,6 +92,11 @@ The <action> type attribute can be add,update,fix,remove.
         names by replacing unprintable characters and restricting the
         length to 255 characters.
       </action>
+      <action issue="COMPRESS-357" type="update" date="2016-06-15">
+        BZip2CompressorOutputStream no longer tries to finish the
+        output stream in finalize. This is a breaking change for code
+        that relied on the finalizer.
+      </action>
     </release>
     <release version="1.11" date="2016-04-06"
              description="Release 1.11">

http://git-wip-us.apache.org/repos/asf/commons-compress/blob/2424036c/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
index 034fbfc..a26fac8 100644
--- a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
@@ -321,8 +321,8 @@ public class BZip2CompressorOutputStream extends CompressorOutputStream
     private Data data;
     private BlockSort blockSorter;
 
-    private final Object outLock = new Object();
     private OutputStream out;
+    private volatile boolean closed;
 
     /**
      * Chooses a blocksize based on the given length of the data to compress.
@@ -393,7 +393,7 @@ public class BZip2CompressorOutputStream extends CompressorOutputStream
 
     @Override
     public void write(final int b) throws IOException {
-        if (this.out != null) {
+        if (!closed) {
             write0(b);
         } else {
             throw new IOException("closed");
@@ -468,37 +468,38 @@ public class BZip2CompressorOutputStream extends CompressorOutputStream
     }
 
     /**
-     * Overriden to close the stream.
+     * Overriden to warn about an unclosed stream.
      */
     @Override
     protected void finalize() throws Throwable {
-        finish();
+        if (!closed) {
+            System.err.println("Unclosed BZip2CompressorOutputStream detected, will *not* close it");
+        }
         super.finalize();
     }
 
 
     public void finish() throws IOException {
-        synchronized(outLock) {
-            if (out != null) {
-                try {
-                    if (this.runLength > 0) {
-                        writeRun();
-                    }
-                    this.currentChar = -1;
-                    endBlock();
-                    endCompression();
-                } finally {
-                    this.out = null;
+        if (!closed) {
+            closed = true;
+            try {
+                if (this.runLength > 0) {
+                    writeRun();
                 }
+                this.currentChar = -1;
+                endBlock();
+                endCompression();
+            } finally {
+                this.out = null;
+                this.blockSorter = null;
+                this.data = null;
             }
         }
-        this.blockSorter = null;
-        this.data = null;
     }
 
     @Override
     public void close() throws IOException {
-        if (out != null) {
+        if (!closed) {
             final OutputStream outShadow = this.out;
             finish();
             outShadow.close();
@@ -628,7 +629,7 @@ public class BZip2CompressorOutputStream extends CompressorOutputStream
                                                 + len + ") > buf.length("
                                                 + buf.length + ").");
         }
-        if (this.out == null) {
+        if (closed) {
             throw new IOException("stream closed");
         }