From f5aad82f2532ed93b6b2ac25b01e3c7b5974a6d7 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 30 Mar 2018 01:52:44 +0200
Subject: [PATCH] Attempt to fix encoder issues

---
 .../primitive/serializer/StringSerializer.kt  | 23 ++++++++++---------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
index c882f38f8..2cc0e4c8e 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
@@ -11,21 +11,15 @@ import java.nio.charset.CharsetEncoder
 import kotlin.concurrent.getOrSet
 
 abstract class StringSerializer(
-  private val encoder: CharsetEncoder,
-  private val decoder: CharsetDecoder,
+  private val charset: Charset,
   private val trailingNullBytes: Int
 ) : Serializer<String?> {
-  constructor(charset: Charset, trailingNullByte: Boolean = false) : this(
-    charset.newEncoder(),
-    charset.newDecoder(),
-    if (trailingNullByte) {
-      1
-    } else {
-      0
-    }
-  )
+  constructor(charset: Charset, trailingNullByte: Boolean = false) :
+    this(charset, if (trailingNullByte) 1 else 0)
 
   private val charBuffer = ThreadLocal<CharBuffer>()
+  private val encoder = ThreadLocal<CharsetEncoder>()
+  private val decoder = ThreadLocal<CharsetDecoder>()
 
   object UTF16 : StringSerializer(Charsets.UTF_16BE)
   object UTF8 : StringSerializer(Charsets.UTF_8)
@@ -45,6 +39,9 @@ abstract class StringSerializer(
     return buf
   }
 
+  private inline fun encoder() = encoder.getOrSet(charset::newEncoder)
+  private inline fun decoder() = decoder.getOrSet(charset::newDecoder)
+
   override fun serialize(buffer: ChainedByteBuffer, data: String?, features: QuasselFeatures) =
     try {
       if (data == null) {
@@ -53,6 +50,7 @@ abstract class StringSerializer(
         val charBuffer = charBuffer(data.length)
         charBuffer.put(data)
         charBuffer.flip()
+        val encoder = encoder()
         encoder.reset()
         val byteBuffer = encoder.encode(charBuffer)
         IntSerializer.serialize(buffer, byteBuffer.remaining() + trailingNullBytes, features)
@@ -71,6 +69,7 @@ abstract class StringSerializer(
       val charBuffer = charBuffer(data.length)
       charBuffer.put(data)
       charBuffer.flip()
+      val encoder = encoder()
       encoder.reset()
       encoder.encode(charBuffer)
     }
@@ -86,6 +85,7 @@ abstract class StringSerializer(
       val limit = buffer.limit()
       buffer.limit(buffer.position() + len - trailingNullBytes)
       val charBuffer = charBuffer(len)
+      val decoder = decoder()
       decoder.reset()
       decoder.decode(buffer, charBuffer, true)
       buffer.limit(limit)
@@ -106,6 +106,7 @@ abstract class StringSerializer(
       val limit = buffer.limit()
       buffer.limit(buffer.position() + Math.max(0, len - trailingNullBytes))
       val charBuffer = charBuffer(len)
+      val decoder = decoder()
       decoder.decode(buffer, charBuffer, true)
       buffer.limit(limit)
       buffer.position(buffer.position() + trailingNullBytes)
-- 
GitLab