--- a/jdk/src/share/classes/java/util/zip/Inflater.java Wed Nov 25 10:02:50 2009 +0000
+++ b/jdk/src/share/classes/java/util/zip/Inflater.java Wed Nov 25 11:29:23 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -72,7 +72,8 @@
*/
public
class Inflater {
- private long strm;
+
+ private final ZStreamRef zsRef;
private byte[] buf = defaultBuf;
private int off, len;
private boolean finished;
@@ -97,7 +98,7 @@
* @param nowrap if true then support GZIP compatible compression
*/
public Inflater(boolean nowrap) {
- strm = init(nowrap);
+ zsRef = new ZStreamRef(init(nowrap));
}
/**
@@ -116,16 +117,18 @@
* @param len the length of the input data
* @see Inflater#needsInput
*/
- public synchronized void setInput(byte[] b, int off, int len) {
+ public void setInput(byte[] b, int off, int len) {
if (b == null) {
throw new NullPointerException();
}
if (off < 0 || len < 0 || off > b.length - len) {
throw new ArrayIndexOutOfBoundsException();
}
- this.buf = b;
- this.off = off;
- this.len = len;
+ synchronized (zsRef) {
+ this.buf = b;
+ this.off = off;
+ this.len = len;
+ }
}
/**
@@ -150,15 +153,18 @@
* @see Inflater#needsDictionary
* @see Inflater#getAdler
*/
- public synchronized void setDictionary(byte[] b, int off, int len) {
- if (strm == 0 || b == null) {
+ public void setDictionary(byte[] b, int off, int len) {
+ if (b == null) {
throw new NullPointerException();
}
if (off < 0 || len < 0 || off > b.length - len) {
throw new ArrayIndexOutOfBoundsException();
}
- setDictionary(strm, b, off, len);
- needDict = false;
+ synchronized (zsRef) {
+ ensureOpen();
+ setDictionary(zsRef.address(), b, off, len);
+ needDict = false;
+ }
}
/**
@@ -180,8 +186,10 @@
* buffer after decompression has finished.
* @return the total number of bytes remaining in the input buffer
*/
- public synchronized int getRemaining() {
- return len;
+ public int getRemaining() {
+ synchronized (zsRef) {
+ return len;
+ }
}
/**
@@ -190,8 +198,10 @@
* to provide more input.
* @return true if no data remains in the input buffer
*/
- public synchronized boolean needsInput() {
- return len <= 0;
+ public boolean needsInput() {
+ synchronized (zsRef) {
+ return len <= 0;
+ }
}
/**
@@ -199,8 +209,10 @@
* @return true if a preset dictionary is needed for decompression
* @see Inflater#setDictionary
*/
- public synchronized boolean needsDictionary() {
- return needDict;
+ public boolean needsDictionary() {
+ synchronized (zsRef) {
+ return needDict;
+ }
}
/**
@@ -209,8 +221,10 @@
* @return true if the end of the compressed data stream has been
* reached
*/
- public synchronized boolean finished() {
- return finished;
+ public boolean finished() {
+ synchronized (zsRef) {
+ return finished;
+ }
}
/**
@@ -228,7 +242,7 @@
* @see Inflater#needsInput
* @see Inflater#needsDictionary
*/
- public synchronized int inflate(byte[] b, int off, int len)
+ public int inflate(byte[] b, int off, int len)
throws DataFormatException
{
if (b == null) {
@@ -237,7 +251,10 @@
if (off < 0 || len < 0 || off > b.length - len) {
throw new ArrayIndexOutOfBoundsException();
}
- return inflateBytes(b, off, len);
+ synchronized (zsRef) {
+ ensureOpen();
+ return inflateBytes(zsRef.address(), b, off, len);
+ }
}
/**
@@ -261,9 +278,11 @@
* Returns the ADLER-32 value of the uncompressed data.
* @return the ADLER-32 value of the uncompressed data
*/
- public synchronized int getAdler() {
- ensureOpen();
- return getAdler(strm);
+ public int getAdler() {
+ synchronized (zsRef) {
+ ensureOpen();
+ return getAdler(zsRef.address());
+ }
}
/**
@@ -285,9 +304,11 @@
* @return the total (non-negative) number of compressed bytes input so far
* @since 1.5
*/
- public synchronized long getBytesRead() {
- ensureOpen();
- return getBytesRead(strm);
+ public long getBytesRead() {
+ synchronized (zsRef) {
+ ensureOpen();
+ return getBytesRead(zsRef.address());
+ }
}
/**
@@ -309,21 +330,25 @@
* @return the total (non-negative) number of uncompressed bytes output so far
* @since 1.5
*/
- public synchronized long getBytesWritten() {
- ensureOpen();
- return getBytesWritten(strm);
+ public long getBytesWritten() {
+ synchronized (zsRef) {
+ ensureOpen();
+ return getBytesWritten(zsRef.address());
+ }
}
/**
* Resets inflater so that a new set of input data can be processed.
*/
- public synchronized void reset() {
- ensureOpen();
- reset(strm);
- buf = defaultBuf;
- finished = false;
- needDict = false;
- off = len = 0;
+ public void reset() {
+ synchronized (zsRef) {
+ ensureOpen();
+ reset(zsRef.address());
+ buf = defaultBuf;
+ finished = false;
+ needDict = false;
+ off = len = 0;
+ }
}
/**
@@ -333,11 +358,14 @@
* method. Once this method is called, the behavior of the Inflater
* object is undefined.
*/
- public synchronized void end() {
- if (strm != 0) {
- end(strm);
- strm = 0;
- buf = null;
+ public void end() {
+ synchronized (zsRef) {
+ long addr = zsRef.address();
+ zsRef.clear();
+ if (addr != 0) {
+ end(addr);
+ buf = null;
+ }
}
}
@@ -349,19 +377,20 @@
}
private void ensureOpen () {
- if (strm == 0)
- throw new NullPointerException();
+ assert Thread.holdsLock(zsRef);
+ if (zsRef.address() == 0)
+ throw new NullPointerException("Inflater has been closed");
}
private native static void initIDs();
private native static long init(boolean nowrap);
- private native static void setDictionary(long strm, byte[] b, int off,
+ private native static void setDictionary(long addr, byte[] b, int off,
int len);
- private native int inflateBytes(byte[] b, int off, int len)
+ private native int inflateBytes(long addr, byte[] b, int off, int len)
throws DataFormatException;
- private native static int getAdler(long strm);
- private native static long getBytesRead(long strm);
- private native static long getBytesWritten(long strm);
- private native static void reset(long strm);
- private native static void end(long strm);
+ private native static int getAdler(long addr);
+ private native static long getBytesRead(long addr);
+ private native static long getBytesWritten(long addr);
+ private native static void reset(long addr);
+ private native static void end(long addr);
}