Snap for 8211684 from ee26c50f8427c9ec8e9c71db209113aa3a568730 to tm-preview2-release
Change-Id: Ief138020829052988259da010ce259d90b1cbf9c
diff --git a/dalvik/src/main/java/dalvik/system/ZygoteHooks.java b/dalvik/src/main/java/dalvik/system/ZygoteHooks.java
index cc7a8d7..bfe1945 100644
--- a/dalvik/src/main/java/dalvik/system/ZygoteHooks.java
+++ b/dalvik/src/main/java/dalvik/system/ZygoteHooks.java
@@ -31,6 +31,9 @@
import java.lang.ReflectiveOperationException;
import libcore.icu.SimpleDateFormatData;
+import sun.util.locale.BaseLocale;
+import java.util.Locale;
+
/**
* Provides hooks for the zygote to call back into the runtime to perform
* parent or child specific initialization..
@@ -99,6 +102,16 @@
}
/**
+ * Called after GC but before fork, it cleans stale cache entries in
+ * BaseLocale and Locale, so to avoid the cleaning to happen in every
+ * child process.
+ */
+ private static void cleanLocaleCaches() {
+ BaseLocale.cleanCache();
+ Locale.cleanCache();
+ }
+
+ /**
* Runs several special GCs to try to clean up a few generations of
* softly- and final-reachable objects, along with any other garbage.
* This is only useful just before a fork().
@@ -114,6 +127,7 @@
*/
System.gc();
runtime.runFinalizationSync();
+ cleanLocaleCaches();
System.gc();
}
diff --git a/ojluni/src/main/java/java/lang/invoke/Transformers.java b/ojluni/src/main/java/java/lang/invoke/Transformers.java
index eca1a30..40b7d6f 100644
--- a/ojluni/src/main/java/java/lang/invoke/Transformers.java
+++ b/ojluni/src/main/java/java/lang/invoke/Transformers.java
@@ -106,18 +106,11 @@
}
}
- /**
- * A method handle that always throws an exception of a specified type.
- *
- * <p>The handle declares a nominal return type, which is immaterial to the execution of the
- * handle because it never returns.
- *
- * @hide
- */
- public static class AlwaysThrow extends Transformer {
+ /** Implements {@code MethodHandles.throwException}. */
+ static class AlwaysThrow extends Transformer {
private final Class<? extends Throwable> exceptionType;
- public AlwaysThrow(Class<?> nominalReturnType, Class<? extends Throwable> exType) {
+ AlwaysThrow(Class<?> nominalReturnType, Class<? extends Throwable> exType) {
super(MethodType.methodType(nominalReturnType, exType));
this.exceptionType = exType;
}
@@ -129,12 +122,12 @@
}
/** Implements {@code MethodHandles.dropArguments}. */
- public static class DropArguments extends Transformer {
+ static class DropArguments extends Transformer {
private final MethodHandle delegate;
private final EmulatedStackFrame.Range range1;
private final EmulatedStackFrame.Range range2;
- public DropArguments(MethodType type, MethodHandle delegate, int startPos, int numDropped) {
+ DropArguments(MethodType type, MethodHandle delegate, int startPos, int numDropped) {
super(type);
this.delegate = delegate;
@@ -160,14 +153,14 @@
}
/** Implements {@code MethodHandles.catchException}. */
- public static class CatchException extends Transformer {
+ static class CatchException extends Transformer {
private final MethodHandle target;
private final MethodHandle handler;
private final Class<?> exType;
private final EmulatedStackFrame.Range handlerArgsRange;
- public CatchException(MethodHandle target, MethodHandle handler, Class<?> exType) {
+ CatchException(MethodHandle target, MethodHandle handler, Class<?> exType) {
super(target.type());
this.target = target;
@@ -216,14 +209,14 @@
}
/** Implements {@code MethodHandles.tryFinally}. */
- public static class TryFinally extends Transformer {
+ static class TryFinally extends Transformer {
/** The target handle to try. */
private final MethodHandle target;
/** The cleanup handle to invoke after the target. */
private final MethodHandle cleanup;
- public TryFinally(MethodHandle target, MethodHandle cleanup) {
+ TryFinally(MethodHandle target, MethodHandle cleanup) {
super(target.type());
this.target = target;
this.cleanup = cleanup;
@@ -280,14 +273,14 @@
}
/** Implements {@code MethodHandles.GuardWithTest}. */
- public static class GuardWithTest extends Transformer {
+ static class GuardWithTest extends Transformer {
private final MethodHandle test;
private final MethodHandle target;
private final MethodHandle fallback;
private final EmulatedStackFrame.Range testArgsRange;
- public GuardWithTest(MethodHandle test, MethodHandle target, MethodHandle fallback) {
+ GuardWithTest(MethodHandle test, MethodHandle target, MethodHandle fallback) {
super(target.type());
this.test = test;
@@ -318,11 +311,11 @@
}
}
- /** Implementation of MethodHandles.arrayElementGetter for reference types. */
- public static class ReferenceArrayElementGetter extends Transformer {
+ /** Implements {@code MethodHandles.arrayElementGetter}. */
+ static class ReferenceArrayElementGetter extends Transformer {
private final Class<?> arrayClass;
- public ReferenceArrayElementGetter(Class<?> arrayClass) {
+ ReferenceArrayElementGetter(Class<?> arrayClass) {
super(
MethodType.methodType(
arrayClass.getComponentType(), new Class<?>[] {arrayClass, int.class}));
@@ -346,11 +339,11 @@
}
}
- /** Implementation of MethodHandles.arrayElementSetter for reference types. */
- public static class ReferenceArrayElementSetter extends Transformer {
+ /** Implements {@code MethodHandles.arrayElementSetter}. */
+ static class ReferenceArrayElementSetter extends Transformer {
private final Class<?> arrayClass;
- public ReferenceArrayElementSetter(Class<?> arrayClass) {
+ ReferenceArrayElementSetter(Class<?> arrayClass) {
super(
MethodType.methodType(
void.class,
@@ -372,11 +365,11 @@
}
}
- /** Implementation of MethodHandles.identity() for reference types. */
- public static class ReferenceIdentity extends Transformer {
+ /** Implements {@code MethodHandles.identity}. */
+ static class ReferenceIdentity extends Transformer {
private final Class<?> type;
- public ReferenceIdentity(Class<?> type) {
+ ReferenceIdentity(Class<?> type) {
super(MethodType.methodType(type, type));
this.type = type;
}
@@ -393,7 +386,8 @@
}
}
- public static class ZeroValue extends Transformer {
+ /** Implements {@code MethodHandles.makeZero}. */
+ static class ZeroValue extends Transformer {
public ZeroValue(Class<?> type) {
super(MethodType.methodType(type));
}
@@ -404,10 +398,11 @@
}
}
- public static class ArrayConstructor extends Transformer {
+ /** Implements {@code MethodHandles.arrayConstructor}. */
+ static class ArrayConstructor extends Transformer {
private final Class<?> componentType;
- public ArrayConstructor(Class<?> arrayType) {
+ ArrayConstructor(Class<?> arrayType) {
super(MethodType.methodType(arrayType, int.class));
componentType = arrayType.getComponentType();
}
@@ -422,10 +417,11 @@
}
}
- public static class ArrayLength extends Transformer {
+ /** Implements {@code MethodHandles.arrayLength}. */
+ static class ArrayLength extends Transformer {
private final Class<?> arrayType;
- public ArrayLength(Class<?> arrayType) {
+ ArrayLength(Class<?> arrayType) {
super(MethodType.methodType(int.class, arrayType));
this.arrayType = arrayType;
}
@@ -474,11 +470,13 @@
writer.putNextInt(length);
}
}
- /*package*/ static class Construct extends Transformer {
+
+ /** Implements {@code MethodHandles.createMethodHandleForConstructor}. */
+ static class Construct extends Transformer {
private final MethodHandle constructorHandle;
private final EmulatedStackFrame.Range callerRange;
- /*package*/ Construct(MethodHandle constructorHandle, MethodType returnedType) {
+ Construct(MethodHandle constructorHandle, MethodType returnedType) {
super(returnedType);
this.constructorHandle = constructorHandle;
this.callerRange = EmulatedStackFrame.Range.all(type());
@@ -523,18 +521,14 @@
}
}
- /**
- * Implements MethodHandle.bindTo.
- *
- * @hide
- */
- public static class BindTo extends Transformer {
+ /** Implements {@code MethodHandle.bindTo}. */
+ static class BindTo extends Transformer {
private final MethodHandle delegate;
private final Object receiver;
private final EmulatedStackFrame.Range range;
- public BindTo(MethodHandle delegate, Object receiver) {
+ BindTo(MethodHandle delegate, Object receiver) {
super(delegate.type().dropParameterTypes(0, 1));
this.delegate = delegate;
@@ -561,14 +555,14 @@
}
}
- /** Implements MethodHandle.filterReturnValue. */
- public static class FilterReturnValue extends Transformer {
+ /** Implements {@code MethodHandle.filterReturnValue}. */
+ static class FilterReturnValue extends Transformer {
private final MethodHandle target;
private final MethodHandle filter;
private final EmulatedStackFrame.Range allArgs;
- public FilterReturnValue(MethodHandle target, MethodHandle filter) {
+ FilterReturnValue(MethodHandle target, MethodHandle filter) {
super(MethodType.methodType(filter.type().rtype(), target.type().ptypes()));
this.target = target;
@@ -605,16 +599,12 @@
}
}
- /*
- * Implements MethodHandles.permuteArguments.
- *
- * @hide
- */
- public static class PermuteArguments extends Transformer {
+ /** Implements {@code MethodHandles.permuteArguments}. */
+ static class PermuteArguments extends Transformer {
private final MethodHandle target;
private final int[] reorder;
- public PermuteArguments(MethodType type, MethodHandle target, int[] reorder) {
+ PermuteArguments(MethodType type, MethodHandle target, int[] reorder) {
super(type);
this.target = target;
@@ -642,16 +632,12 @@
}
}
- /**
- * Makes a variable-arity adapter that groups trailing varargs arguments into an array.
- *
- * @hide
- */
- /*package*/ static class VarargsCollector extends Transformer {
+ /** Implements {@code MethodHandle.asVarargsCollector}. */
+ static class VarargsCollector extends Transformer {
final MethodHandle target;
private final Class<?> arrayType;
- /*package*/ VarargsCollector(MethodHandle target) {
+ VarargsCollector(MethodHandle target) {
super(target.type());
Class<?>[] parameterTypes = target.type().ptypes();
@@ -1179,7 +1165,7 @@
}
}
- /** Implements MethodHandles.invoker & MethodHandles.exactInvoker. */
+ /** Implements {@code MethodHandles.invoker} and {@code MethodHandles.exactInvoker}. */
static class Invoker extends Transformer {
private final MethodType targetType;
private final boolean isExactInvoker;
@@ -1252,7 +1238,7 @@
}
}
- /** Implements MethodHandle.asSpreader / MethodHandles.spreadInvoker. */
+ /** Implements {@code MethodHandle.asSpreader}. */
static class Spreader extends Transformer {
/** The method handle we're delegating to. */
private final MethodHandle target;
@@ -1414,7 +1400,7 @@
}
}
- /** Implements MethodHandle.asCollector. */
+ /** Implements {@code MethodHandle.asCollector}. */
static class Collector extends Transformer {
private final MethodHandle target;
@@ -1568,9 +1554,7 @@
}
}
- /*
- * Implements MethodHandles.filterArguments.
- */
+ /** Implements {@code MethodHandles.filterArguments}. */
static class FilterArguments extends Transformer {
/** The target handle. */
private final MethodHandle target;
@@ -1648,7 +1632,7 @@
}
}
- /** Implements MethodHandles.collectArguments. */
+ /** Implements {@code MethodHandles.collectArguments}. */
static class CollectArguments extends Transformer {
private final MethodHandle target;
private final MethodHandle collector;
@@ -1732,7 +1716,7 @@
}
}
- /** Implements MethodHandles.foldArguments. */
+ /** Implements {@code MethodHandles.foldArguments}. */
static class FoldArguments extends Transformer {
private final MethodHandle target;
private final MethodHandle combiner;
@@ -1822,7 +1806,7 @@
}
}
- /** Implements MethodHandles.insertArguments. */
+ /** Implements {@code MethodHandles.insertArguments}. */
static class InsertArguments extends Transformer {
private final MethodHandle target;
private final int pos;
@@ -1909,10 +1893,11 @@
}
}
- public static class AsTypeAdapter extends Transformer {
+ /** Implements {@code MethodHandle.asType}. */
+ static class AsTypeAdapter extends Transformer {
private final MethodHandle target;
- public AsTypeAdapter(MethodHandle target, MethodType type) {
+ AsTypeAdapter(MethodHandle target, MethodType type) {
super(type);
this.target = target;
}
@@ -2298,11 +2283,11 @@
}
}
- /** Implements {@link java.lang.invokeMethodHandles#explicitCastArguments()}. */
- public static class ExplicitCastArguments extends Transformer {
+ /** Implements {@code MethodHandles.explicitCastArguments}. */
+ static class ExplicitCastArguments extends Transformer {
private final MethodHandle target;
- public ExplicitCastArguments(MethodHandle target, MethodType type) {
+ ExplicitCastArguments(MethodHandle target, MethodType type) {
super(type);
this.target = target;
}
@@ -2966,10 +2951,8 @@
}
}
- /**
- * Implements transform for use by MethodHandles.loop().
- */
- public static class Loop extends Transformer {
+ /** Implements {@code MethodHandles.loop}. */
+ static class Loop extends Transformer {
/** Loop variable initialization methods. */
final MethodHandle[] inits;
diff --git a/ojluni/src/main/java/java/security/IdentityScope.java b/ojluni/src/main/java/java/security/IdentityScope.java
index 61d37cb..9dddd56 100644
--- a/ojluni/src/main/java/java/security/IdentityScope.java
+++ b/ojluni/src/main/java/java/security/IdentityScope.java
@@ -63,6 +63,8 @@
* {@code java.security.Principal}.
*/
@Deprecated
+// Android-added: Identity is deprecated too, no need to warn here.
+@SuppressWarnings("removal")
public abstract
class IdentityScope extends Identity {
diff --git a/ojluni/src/main/java/java/util/Locale.java b/ojluni/src/main/java/java/util/Locale.java
index 80f9ed7..ffa8b71 100644
--- a/ojluni/src/main/java/java/util/Locale.java
+++ b/ojluni/src/main/java/java/util/Locale.java
@@ -837,6 +837,19 @@
return LOCALECACHE.get(key);
}
+ // BEGIN Android-added: Add a static method to clear the stale entries in Zygote
+ /**
+ * This method cleans the stale entries in LOCALECACHE. This would
+ * be called in Zygote after GC but before fork, and so to avoid the
+ * cleaning of the cache to happen in child processes.
+ *
+ * @hide
+ */
+ public static void cleanCache() {
+ LOCALECACHE.cleanStaleEntries();
+ }
+ // END Android-added: Add a static method to clear the stale entries in Zygote
+
private static class Cache extends LocaleObjectCache<LocaleKey, Locale> {
private Cache() {
}
diff --git a/ojluni/src/main/java/sun/util/locale/BaseLocale.java b/ojluni/src/main/java/sun/util/locale/BaseLocale.java
index e0e9ed0..c037d67 100644
--- a/ojluni/src/main/java/sun/util/locale/BaseLocale.java
+++ b/ojluni/src/main/java/sun/util/locale/BaseLocale.java
@@ -164,6 +164,19 @@
return h;
}
+ // BEGIN Android-added: Add a static method to clear the stale entries in Zygote
+ /**
+ * This method cleans the stale entries in BaseLocale.CACHE. This would
+ * be called in Zygote after GC but before fork, and so to avoid the
+ * cleaning of the cache to happen in child processes.
+ *
+ * @hide
+ */
+ public static void cleanCache() {
+ CACHE.cleanStaleEntries();
+ }
+ // END Android-added: Add a static method to clear the stale entries in Zygote
+
private static final class Key {
private final SoftReference<String> lang;
private final SoftReference<String> scrt;
diff --git a/ojluni/src/main/java/sun/util/locale/LocaleObjectCache.java b/ojluni/src/main/java/sun/util/locale/LocaleObjectCache.java
index eae1480..f859966 100644
--- a/ojluni/src/main/java/sun/util/locale/LocaleObjectCache.java
+++ b/ojluni/src/main/java/sun/util/locale/LocaleObjectCache.java
@@ -88,8 +88,9 @@
return (oldEntry == null) ? null : oldEntry.get();
}
+ // Android-changed: Make it public / protected to clean stale entries before Zygote forks
@SuppressWarnings("unchecked")
- private void cleanStaleEntries() {
+ public void cleanStaleEntries() {
CacheEntry<K, V> entry;
while ((entry = (CacheEntry<K, V>)queue.poll()) != null) {
map.remove(entry.getKey());
diff --git a/ojluni/src/test/java/net/SocketOptions/MinimumRcvBufferSize.java b/ojluni/src/test/java/net/SocketOptions/MinimumRcvBufferSize.java
index 767058f..a2f333e 100644
--- a/ojluni/src/test/java/net/SocketOptions/MinimumRcvBufferSize.java
+++ b/ojluni/src/test/java/net/SocketOptions/MinimumRcvBufferSize.java
@@ -38,29 +38,24 @@
@Test
public void testBufferSize() throws Exception {
- boolean error = false;
- // BEGIN Android-removed: failing in Cuttlefish (b/218814458).
- /*
ServerSocketChannel channel = ServerSocketChannel.open();
+ // Android-added: set initial buffersize to zero (b/218814458)
+ channel.setOption(StandardSocketOptions.SO_RCVBUF, 0);
int before = channel.getOption(StandardSocketOptions.SO_RCVBUF);
channel.setOption(StandardSocketOptions.SO_RCVBUF, Integer.MAX_VALUE);
int after = channel.getOption(StandardSocketOptions.SO_RCVBUF);
if (before > after) {
- fail("Test failed: SO_RCVBUF");
- error = true;
+ fail("Test failed: SO_RCVBUF: " + before + " " + after);
}
- */
- // END Android-removed: failing in Cuttlefish (b/218814458).
SocketChannel channel1 = SocketChannel.open();
- int before = channel1.getOption(StandardSocketOptions.SO_SNDBUF);
+ // Android-added: set initial buffersize to zero (b/218814458)
+ channel1.setOption(StandardSocketOptions.SO_SNDBUF, 0);
+ before = channel1.getOption(StandardSocketOptions.SO_SNDBUF);
channel1.setOption(StandardSocketOptions.SO_SNDBUF, Integer.MAX_VALUE);
- int after = channel1.getOption(StandardSocketOptions.SO_SNDBUF);
+ after = channel1.getOption(StandardSocketOptions.SO_SNDBUF);
if (before > after) {
- fail("Test failed: SO_SNDBUF");
- error = true;
+ fail("Test failed: SO_SNDBUF: " + before + " " + after);
}
- if (error)
- throw new RuntimeException("Test failed");
}
}
\ No newline at end of file