On Friday 09 May 2008 15:28, [EMAIL PROTECTED] wrote: > Author: j16sdiz > Date: 2008-05-09 14:28:23 +0000 (Fri, 09 May 2008) > New Revision: 19875 > > Added: > trunk/freenet/src/freenet/support/ByteBufferInputStream.java > Modified: > trunk/freenet/src/freenet/io/comm/FreenetInetAddress.java > trunk/freenet/src/freenet/io/comm/Message.java > trunk/freenet/src/freenet/io/comm/Peer.java > trunk/freenet/src/freenet/support/BitArray.java > trunk/freenet/src/freenet/support/Buffer.java > trunk/freenet/src/freenet/support/Serializer.java > trunk/freenet/src/freenet/support/ShortBuffer.java > Log: > Fix #2270: Performance, CPU usage on idle node > - Use ByteBufferInputStream > - Relax DataInputStream to DataInput in some classes > > > Added: trunk/freenet/src/freenet/support/ByteBufferInputStream.java > =================================================================== > --- trunk/freenet/src/freenet/support/ByteBufferInputStream.java > (rev 0) > +++ trunk/freenet/src/freenet/support/ByteBufferInputStream.java > 2008-05-09 14:28:23 UTC (rev 19875) > @@ -0,0 +1,202 @@ > +/* This code is part of Freenet. It is distributed under the GNU General > + * Public License, version 2 (or at your option any later version). See > + * http://www.gnu.org/ for further details of the GPL. */ > +package freenet.support; > + > +import java.io.DataInput; > +import java.io.DataInputStream; > +import java.io.EOFException; > +import java.io.IOException; > +import java.io.InputStream; > +import java.nio.BufferUnderflowException; > +import java.nio.ByteBuffer; > + > +/** > + * @author sdiz > + */ > +public class ByteBufferInputStream extends InputStream implements DataInput { > + protected ByteBuffer buf; > + > + public ByteBufferInputStream(byte[] array) { > + this(array, 0, array.length); > + } > + > + public ByteBufferInputStream(byte[] array, int offset, int length) { > + this(ByteBuffer.wrap(array, offset, length)); > + } > + public ByteBufferInputStream(ByteBuffer buf) { > + this.buf = buf; > + } > + > + public int read() throws IOException { > + try { > + return buf.get() & Integer.MAX_VALUE; > + } catch (BufferUnderflowException e) { > + return -1; > + } > + } > + > + > + public int remaining() { > + return buf.remaining(); > + } > + > + public boolean readBoolean() throws IOException { > + try { > + return buf.get() != 0; > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public byte readByte() throws IOException { > + try { > + return buf.get(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public char readChar() throws IOException { > + try { > + return buf.getChar(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public double readDouble() throws IOException { > + try { > + return buf.getDouble(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public float readFloat() throws IOException { > + try { > + return buf.getFloat(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public void readFully(byte[] b) throws IOException { > + try { > + buf.get(b); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public void readFully(byte[] b, int off, int len) throws IOException { > + try { > + buf.get(b, off, len); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public int readInt() throws IOException { > + try { > + return buf.getInt(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public long readLong() throws IOException { > + try { > + return buf.getLong(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public short readShort() throws IOException { > + try { > + return buf.getShort(); > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + > + public int readUnsignedByte() throws IOException { > + try { > + return buf.get() & Integer.MAX_VALUE; > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public int readUnsignedShort() throws IOException { > + try { > + return buf.getShort() & Integer.MAX_VALUE; > + } catch (BufferUnderflowException e) { > + EOFException ioe = new EOFException(); > + ioe.initCause(e); > + throw ioe; > + } > + } > + > + public int skipBytes(int n) throws IOException { > + int skip = Math.min(n, buf.remaining()); > + buf.position(buf.position() + skip);
This should throw IOException, not IllegalArgumentException, if there isn't
enough space left.
> + return skip;
> + }
> +
> + public String readUTF() throws IOException {
> + return DataInputStream.readUTF(this);
> + }
> + /**
> + * @deprecated [EMAIL PROTECTED] DataInputStream#readLine()} is
> deprecated, so why
not?
> + */
> + public String readLine() throws IOException {
> + // hmmmm bad
> + return new DataInputStream(this).readLine();
> + }
> +
> + /**
> + * Slice a piece of ByteBuffer into a new ByteBufferInputStream
> + *
> + * @param size
> + */
> + public ByteBufferInputStream slice(int size) throws IOException {
> + try {
> + ByteBuffer bf2 = buf.slice();
> + bf2.limit(size);
Likewise here.
> +
> + skip(size);
> +
> + return new ByteBufferInputStream(bf2);
> + } catch (BufferUnderflowException e) {
> + EOFException ioe = new EOFException();
> + ioe.initCause(e);
> + throw ioe;
> + }
> + }
> +
> +}
>
> Modified: trunk/freenet/src/freenet/support/Serializer.java
> ===================================================================
> --- trunk/freenet/src/freenet/support/Serializer.java 2008-05-09 13:15:41
UTC (rev 19874)
> +++ trunk/freenet/src/freenet/support/Serializer.java 2008-05-09 14:28:23
UTC (rev 19875)
> @@ -19,7 +19,7 @@
>
> package freenet.support;
>
> -import java.io.DataInputStream;
> +import java.io.DataInput;
> import java.io.DataOutputStream;
> import java.io.IOException;
> import java.util.Iterator;
> @@ -44,7 +44,7 @@
> public static final String VERSION = "$Id: Serializer.java,v 1.5
2005/09/15 18:16:04 amphibian Exp $";
> public static final int MAX_BITARRAY_SIZE = 2048*8;
>
> - public static List readListFromDataInputStream(Class elementType,
DataInputStream dis) throws IOException {
> + public static List readListFromDataInputStream(Class elementType,
DataInput dis) throws IOException {
> LinkedList ret = new LinkedList();
> int length = dis.readInt();
> for (int x = 0; x < length; x++) {
> @@ -53,18 +53,16 @@
> return ret;
> }
>
> - public static Object readFromDataInputStream(Class type,
> DataInputStream
dis) throws IOException {
> + public static Object readFromDataInputStream(Class type, DataInput dis)
throws IOException {
> if (type.equals(Boolean.class)) {
> - int bool=dis.read();
> + int bool = dis.readByte();
> if (bool==1)
> return Boolean.TRUE;
> if (bool==0)
> return Boolean.FALSE;
> throw new IOException("Boolean is non boolean value:
> "+bool);
> } else if (type.equals(Byte.class)) {
> - int b=dis.read();
> - if (b<0)
> - throw new IOException();
> + int b = dis.readByte();
> return new Byte((byte)b);
> } else if (type.equals(Short.class)) {
> return new Short(dis.readShort());
>
> Modified: trunk/freenet/src/freenet/support/ShortBuffer.java
> ===================================================================
> --- trunk/freenet/src/freenet/support/ShortBuffer.java 2008-05-09
> 13:15:41
UTC (rev 19874)
> +++ trunk/freenet/src/freenet/support/ShortBuffer.java 2008-05-09
> 14:28:23
UTC (rev 19875)
> @@ -41,7 +41,7 @@
> * @param dis
> * @throws IOException
> */
> - public ShortBuffer(DataInputStream dis) throws IOException {
> + public ShortBuffer(DataInput dis) throws IOException {
> _data = new byte[dis.readShort()];
> _length = (short)_data.length;
> _start = 0;
I wonder if we can get rid of or at least rename Buffer and/or ShortBuffer.
pgpAit81zHGJ5.pgp
Description: PGP signature
_______________________________________________ Devl mailing list [email protected] http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
