Skip to content
Snippets Groups Projects
Commit 89cdc3b7 authored by Shawn Pearce's avatar Shawn Pearce
Browse files

Reuse the line buffer between strings in PacketLineIn


When reading pkt-lines off an InputStream we are quite likely to
consume a whole group of fairly short lines in rapid succession, such
as in the have exchange that occurs in the fetch-pack/upload-pack
protocol.  Rather than allocating a throwaway buffer for each
line's raw byte sequence, reuse a buffer that is equal to the small
side-band packet size, which is 1000 bytes.  Text based pkt-lines
are required to be less than this size because many widely deployed
versions of C Git use a statically allocated array of this length.

Change-Id: Ia5c8e95b85020f7f80b6d269dda5059b092d274d
Signed-off-by: default avatarShawn O. Pearce <spearce@spearce.org>
parent c0f09389
No related branches found
No related tags found
No related merge requests found
/* /*
* Copyright (C) 2008-2009, Google Inc. * Copyright (C) 2008-2010, Google Inc.
* Copyright (C) 2008-2009, Robin Rosenberg <robin.rosenberg@dewire.com> * Copyright (C) 2008-2009, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* and other copyright owners as documented in the project's IP log. * and other copyright owners as documented in the project's IP log.
...@@ -72,11 +72,11 @@ static enum AckNackResult { ...@@ -72,11 +72,11 @@ static enum AckNackResult {
private final InputStream in; private final InputStream in;
private final byte[] lenbuffer; private final byte[] lineBuffer;
PacketLineIn(final InputStream i) { PacketLineIn(final InputStream i) {
in = i; in = i;
lenbuffer = new byte[4]; lineBuffer = new byte[SideBandOutputStream.SMALL_BUF];
} }
AckNackResult readACK(final MutableObjectId returnedId) throws IOException { AckNackResult readACK(final MutableObjectId returnedId) throws IOException {
...@@ -124,22 +124,27 @@ String readStringRaw() throws IOException { ...@@ -124,22 +124,27 @@ String readStringRaw() throws IOException {
len -= 4; // length header (4 bytes) len -= 4; // length header (4 bytes)
final byte[] raw = new byte[len]; byte[] raw;
if (len <= lineBuffer.length)
raw = lineBuffer;
else
raw = new byte[len];
IO.readFully(in, raw, 0, len); IO.readFully(in, raw, 0, len);
return RawParseUtils.decode(Constants.CHARSET, raw, 0, len); return RawParseUtils.decode(Constants.CHARSET, raw, 0, len);
} }
int readLength() throws IOException { int readLength() throws IOException {
IO.readFully(in, lenbuffer, 0, 4); IO.readFully(in, lineBuffer, 0, 4);
try { try {
final int len = RawParseUtils.parseHexInt16(lenbuffer, 0); final int len = RawParseUtils.parseHexInt16(lineBuffer, 0);
if (len != 0 && len < 4) if (len != 0 && len < 4)
throw new ArrayIndexOutOfBoundsException(); throw new ArrayIndexOutOfBoundsException();
return len; return len;
} catch (ArrayIndexOutOfBoundsException err) { } catch (ArrayIndexOutOfBoundsException err) {
throw new IOException("Invalid packet line header: " throw new IOException("Invalid packet line header: "
+ (char) lenbuffer[0] + (char) lenbuffer[1] + (char) lineBuffer[0] + (char) lineBuffer[1]
+ (char) lenbuffer[2] + (char) lenbuffer[3]); + (char) lineBuffer[2] + (char) lineBuffer[3]);
} }
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment