protected final <T extends Message> IoBufferEx encode( String cacheKey, MessageEncoder<T> encoder, T message, IoBufferAllocatorEx<?> allocator, int flags) { ConcurrentMap<String, IoBufferEx> cache = message.getCache(); // if cache is not initialized, throw exception (caller should guard) if (cache == null) { throw new IllegalStateException("Cache not initialized"); } // lookup existing cached encoding entry IoBufferEx cachedBuffer = cache.get(cacheKey); if (cachedBuffer == null) { // when cachedBuffer is null, perform encode, then cache the result // with standard atomic race condition awareness (put-if-absent) if ((flags & FLAG_ZERO_COPY) != 0) { if (!cache.isEmpty()) { flags &= ~FLAG_ZERO_COPY; } } IoBufferEx newCachedBuffer = encoder.encode(allocator, message, flags); if (newCachedBuffer instanceof MessageBuffer<?>) { MessageBuffer<?> cacheableBuffer = (MessageBuffer<?>) newCachedBuffer; cacheableBuffer.setAutoCache(true); } cachedBuffer = cache.putIfAbsent(cacheKey, newCachedBuffer); if (cachedBuffer == null) { cachedBuffer = newCachedBuffer; } } return cachedBuffer; }