From 3386451d202d3de5d223dec8de08a90f8fe607e0 Mon Sep 17 00:00:00 2001 From: Jesse Rosenstock Date: Mon, 18 Nov 2002 14:15:16 +0000 Subject: [PATCH] 2002-11-17 Jesse Rosenstock * java/nio/charset/Charset.java (): New method. (encode): Synchronize use of cached encoder object. (decode): Synchronize use of cached encoder object. From-SVN: r59218 --- libjava/ChangeLog | 7 ++++ libjava/java/nio/charset/Charset.java | 52 ++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 85215d57465..7942b98059d 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2002-11-17 Jesse Rosenstock + + * java/nio/charset/Charset.java + (): New method. + (encode): Synchronize use of cached encoder object. + (decode): Synchronize use of cached encoder object. + 2002-11-18 Michael Koch * gnu/java/nio/ByteBufferImpl.java, diff --git a/libjava/java/nio/charset/Charset.java b/libjava/java/nio/charset/Charset.java index 5d96daf7f76..cc60c99b9b6 100644 --- a/libjava/java/nio/charset/Charset.java +++ b/libjava/java/nio/charset/Charset.java @@ -55,6 +55,18 @@ import gnu.java.nio.charset.Provider; */ public abstract class Charset implements Comparable { + private static CharsetEncoder cachedEncoder; + private static CharsetDecoder cachedDecoder; + + static + { + synchronized (Charset.class) + { + cachedEncoder = null; + cachedDecoder = null; + } + } + private final String canonicalName; private final String[] aliases; @@ -195,10 +207,21 @@ public abstract class Charset implements Comparable { try { - // TODO: cache encoders between sucessive invocations - return newEncoder ().onMalformedInput (CodingErrorAction.REPLACE) - .onUnmappableCharacter (CodingErrorAction.REPLACE) - .encode (cb); + // NB: This implementation serializes different threads calling + // Charset.encode(), a potential performance problem. It might + // be better to remove the cache, or use ThreadLocal to cache on + // a per-thread basis. + synchronized (Charset.class) + { + if (cachedEncoder == null) + { + cachedEncoder = newEncoder () + .onMalformedInput (CodingErrorAction.REPLACE) + .onUnmappableCharacter (CodingErrorAction.REPLACE); + } + + return cachedEncoder.encode (cb); + } } catch (CharacterCodingException e) { @@ -214,11 +237,22 @@ public abstract class Charset implements Comparable public CharBuffer decode (ByteBuffer bb) { try - { - // TODO: cache encoders between sucessive invocations - return newDecoder ().onMalformedInput (CodingErrorAction.REPLACE) - .onUnmappableCharacter (CodingErrorAction.REPLACE) - .decode (bb); + { + // NB: This implementation serializes different threads calling + // Charset.decode(), a potential performance problem. It might + // be better to remove the cache, or use ThreadLocal to cache on + // a per-thread basis. + synchronized (Charset.class) + { + if (cachedDecoder == null) + { + cachedDecoder = newDecoder () + .onMalformedInput (CodingErrorAction.REPLACE) + .onUnmappableCharacter (CodingErrorAction.REPLACE); + } + + return cachedDecoder.decode (bb); + } } catch (CharacterCodingException e) { -- 2.30.2