Merge pull request #5 from psm14/feature/thread_safety

Make Utf8Utils thread-safe
This commit is contained in:
Ben Gruver 2013-02-15 14:30:56 -08:00
commit 0c838afb2d
2 changed files with 12 additions and 12 deletions

View File

@ -40,6 +40,9 @@ public class ByteArrayInput
/** >= 0; current read cursor */ /** >= 0; current read cursor */
private int cursor; private int cursor;
/* buffer for reading UTF-8 strings */
private char[] buffer = null;
/** /**
* Constructs an instance with the given data * Constructs an instance with the given data
* *
@ -291,7 +294,11 @@ public class ByteArrayInput
//skip the terminating null //skip the terminating null
cursor++; cursor++;
return Utf8Utils.utf8BytesToString(data, startPosition, byteCount); if (buffer == null || buffer.length < byteCount) {
buffer = new char[byteCount];
}
return Utf8Utils.utf8BytesToString(buffer, data, startPosition, byteCount);
} }
/** {@inheritDoc} */ /** {@inheritDoc} */

View File

@ -68,23 +68,16 @@ public final class Utf8Utils {
return result; return result;
} }
private static char[] tempBuffer = null;
/** /**
* Converts an array of UTF-8 bytes into a string. * Converts an array of UTF-8 bytes into a string.
* *
* This method uses a global buffer to avoid having to allocate one every time, so it is *not* thread-safe * @param buffer a buffer to hold the chars as they are read. Make sure the length of the array is at least 'length'
*
* @param bytes non-null; the bytes to convert * @param bytes non-null; the bytes to convert
* @param start the start index of the utf8 string to convert * @param start the start index of the utf8 string to convert
* @param length the length of the utf8 string to convert, not including any null-terminator that might be present * @param length the length of the utf8 string to convert, not including any null-terminator that might be present
* @return non-null; the converted string * @return non-null; the converted string
*/ */
public static String utf8BytesToString(byte[] bytes, int start, int length) { public static String utf8BytesToString(char[] buffer, byte[] bytes, int start, int length) {
if (tempBuffer == null || tempBuffer.length < length) {
tempBuffer = new char[length];
}
char[] chars = tempBuffer;
int outAt = 0; int outAt = 0;
for (int at = start; length > 0; /*at*/) { for (int at = start; length > 0; /*at*/) {
@ -157,11 +150,11 @@ public final class Utf8Utils {
return throwBadUtf8(v0, at); return throwBadUtf8(v0, at);
} }
} }
chars[outAt] = out; buffer[outAt] = out;
outAt++; outAt++;
} }
return new String(chars, 0, outAt); return new String(buffer, 0, outAt);
} }
/** /**