Simplify InternalThreadLocalMap (#10872)
Motivation: I did not see any tangible advantage to the padding. The only other field that was guarded was a rarely changed object reference to a BitSet. Without the padding, there is also no longer any use of the inheritance hierarchy. The padding was also using `long`, which would not necessarily prevent the JVM from fitting the aforementioned object reference in an alignment gap. Modification: Move all the fields into the InternalThreadLocalMap Result: Simpler code. This resolves the discussion in https://github.com/netty/netty/issues/9284
This commit is contained in:
parent
c85dd51bc0
commit
26fc8d4614
@ -31,15 +31,19 @@ import java.util.IdentityHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* The internal data structure that stores the thread-local variables for Netty and all {@link FastThreadLocal}s.
|
||||
* Note that this class is for internal use only and is subject to change at any time. Use {@link FastThreadLocal}
|
||||
* unless you know what you are doing.
|
||||
*/
|
||||
public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap {
|
||||
public final class InternalThreadLocalMap {
|
||||
|
||||
private static final InternalLogger logger = InternalLoggerFactory.getInstance(InternalThreadLocalMap.class);
|
||||
private static final ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap =
|
||||
new ThreadLocal<>();
|
||||
private static final AtomicInteger nextIndex = new AtomicInteger();
|
||||
|
||||
private static final int DEFAULT_ARRAY_LIST_INITIAL_CAPACITY = 8;
|
||||
private static final int STRING_BUILDER_INITIAL_SIZE;
|
||||
@ -49,6 +53,25 @@ public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap
|
||||
|
||||
public static final Object UNSET = new Object();
|
||||
|
||||
/** Used by {@link FastThreadLocal} */
|
||||
private Object[] indexedVariables;
|
||||
|
||||
// Core thread-locals
|
||||
private int futureListenerStackDepth;
|
||||
private int localChannelReaderStackDepth;
|
||||
private Map<Class<?>, Boolean> handlerSharableCache;
|
||||
private ThreadLocalRandom random;
|
||||
private Map<Class<?>, TypeParameterMatcher> typeParameterMatcherGetCache;
|
||||
private Map<Class<?>, Map<String, TypeParameterMatcher>> typeParameterMatcherFindCache;
|
||||
|
||||
// String-related thread-locals
|
||||
private StringBuilder stringBuilder;
|
||||
private Map<Charset, CharsetEncoder> charsetEncoderCache;
|
||||
private Map<Charset, CharsetDecoder> charsetDecoderCache;
|
||||
|
||||
// ArrayList-related thread-locals
|
||||
private ArrayList<Object> arrayList;
|
||||
|
||||
private BitSet cleanerFlags;
|
||||
|
||||
static {
|
||||
@ -86,7 +109,6 @@ public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap
|
||||
}
|
||||
|
||||
private static InternalThreadLocalMap slowGet() {
|
||||
ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = UnpaddedInternalThreadLocalMap.slowThreadLocalMap;
|
||||
InternalThreadLocalMap ret = slowThreadLocalMap.get();
|
||||
if (ret == null) {
|
||||
ret = new InternalThreadLocalMap();
|
||||
@ -121,12 +143,8 @@ public final class InternalThreadLocalMap extends UnpaddedInternalThreadLocalMap
|
||||
return nextIndex.get() - 1;
|
||||
}
|
||||
|
||||
// Cache line padding (must be public)
|
||||
// With CompressedOops enabled, an instance of this class should occupy at least 128 bytes.
|
||||
public long rp1, rp2, rp3, rp4, rp5, rp6, rp7, rp8, rp9;
|
||||
|
||||
private InternalThreadLocalMap() {
|
||||
super(newIndexedVariableTable());
|
||||
indexedVariables = newIndexedVariableTable();
|
||||
}
|
||||
|
||||
private static Object[] newIndexedVariableTable() {
|
||||
|
@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright 2014 The Netty Project
|
||||
*
|
||||
* The Netty Project licenses this file to you under the Apache License,
|
||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at:
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package io.netty.util.internal;
|
||||
|
||||
import io.netty.util.concurrent.FastThreadLocal;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.CharsetDecoder;
|
||||
import java.nio.charset.CharsetEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* The internal data structure that stores the thread-local variables for Netty and all {@link FastThreadLocal}s.
|
||||
* Note that this class is for internal use only and is subject to change at any time. Use {@link FastThreadLocal}
|
||||
* unless you know what you are doing.
|
||||
*/
|
||||
class UnpaddedInternalThreadLocalMap {
|
||||
|
||||
static final ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = new ThreadLocal<>();
|
||||
static final AtomicInteger nextIndex = new AtomicInteger();
|
||||
|
||||
/** Used by {@link FastThreadLocal} */
|
||||
Object[] indexedVariables;
|
||||
|
||||
// Core thread-locals
|
||||
int futureListenerStackDepth;
|
||||
int localChannelReaderStackDepth;
|
||||
Map<Class<?>, Boolean> handlerSharableCache;
|
||||
ThreadLocalRandom random;
|
||||
Map<Class<?>, TypeParameterMatcher> typeParameterMatcherGetCache;
|
||||
Map<Class<?>, Map<String, TypeParameterMatcher>> typeParameterMatcherFindCache;
|
||||
|
||||
// String-related thread-locals
|
||||
StringBuilder stringBuilder;
|
||||
Map<Charset, CharsetEncoder> charsetEncoderCache;
|
||||
Map<Charset, CharsetDecoder> charsetDecoderCache;
|
||||
|
||||
// ArrayList-related thread-locals
|
||||
ArrayList<Object> arrayList;
|
||||
|
||||
UnpaddedInternalThreadLocalMap(Object[] indexedVariables) {
|
||||
this.indexedVariables = indexedVariables;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user