Merge "Switch NetworkInterface to one getifaddrs call."
diff --git a/JavaLibrary.mk b/JavaLibrary.mk
index bbe2345..5f9cceb 100644
--- a/JavaLibrary.mk
+++ b/JavaLibrary.mk
@@ -87,6 +87,7 @@
LOCAL_JAVACFLAGS := $(local_javac_flags)
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-all
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_REQUIRED_MODULES := tzdata
@@ -101,6 +102,7 @@
LOCAL_JAVACFLAGS := $(local_javac_flags)
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-oj
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_JAVA_LIBRARIES := core-all
@@ -117,6 +119,7 @@
LOCAL_JAVACFLAGS := $(local_javac_flags)
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-libart
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_JAVA_LIBRARIES := core-all
@@ -135,6 +138,7 @@
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-oj-testdex
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_JAVA_LIBRARIES := core-all
@@ -151,6 +155,7 @@
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-libart-testdex
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_JAVA_LIBRARIES := core-all
@@ -218,6 +223,7 @@
LOCAL_JAVACFLAGS := $(local_javac_flags)
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-all-hostdex
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_REQUIRED_MODULES := tzdata-host
@@ -232,6 +238,7 @@
LOCAL_JAVACFLAGS := $(local_javac_flags)
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-oj-hostdex
LOCAL_NOTICE_FILE := $(LOCAL_PATH)/ojluni/NOTICE
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
@@ -248,6 +255,7 @@
LOCAL_JAVACFLAGS := $(local_javac_flags)
LOCAL_DX_FLAGS := --core-library
LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_MODULE := core-libart-hostdex
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
LOCAL_JAVA_LIBRARIES := core-oj-hostdex
diff --git a/java_tests_blacklist b/java_tests_blacklist
index 97782ea..c0fbc88 100644
--- a/java_tests_blacklist
+++ b/java_tests_blacklist
@@ -1,7 +1,5 @@
luni/src/test/java/tests/security/cert/X509CRLSelector2Test.java
luni/src/test/java/tests/security/cert/X509CertSelectorTest.java
-luni/src/test/java/libcore/net/url/UrlUtilsTest.java
luni/src/test/java/libcore/java/util/zip/Zip64Test.java
luni/src/test/java/libcore/java/util/zip/Zip64FileTest.java
-luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
luni/src/test/java/libcore/java/security/cert/X509CertificateTest.java
diff --git a/luni/src/main/native/NetworkUtilities.cpp b/luni/src/main/native/NetworkUtilities.cpp
index e357b4a..b285a01 100644
--- a/luni/src/main/native/NetworkUtilities.cpp
+++ b/luni/src/main/native/NetworkUtilities.cpp
@@ -116,8 +116,11 @@
}
// Get the byte array that stores the IP address bytes in the InetAddress.
- static jmethodID bytesMid = env->GetMethodID(JniConstants::inetAddressClass, "getAddressInternal", "()[B");
+ static jmethodID bytesMid = env->GetMethodID(JniConstants::inetAddressClass, "getAddress", "()[B");
ScopedLocalRef<jbyteArray> addressBytes(env, reinterpret_cast<jbyteArray>(env->CallObjectMethod(inetAddress, bytesMid)));
+ if (env->ExceptionCheck()) {
+ return false;
+ }
if (addressBytes.get() == NULL) {
jniThrowNullPointerException(env, NULL);
return false;
diff --git a/luni/src/test/java/libcore/io/OsTest.java b/luni/src/test/java/libcore/io/OsTest.java
index d2c4058..552c2a1 100644
--- a/luni/src/test/java/libcore/io/OsTest.java
+++ b/luni/src/test/java/libcore/io/OsTest.java
@@ -49,7 +49,7 @@
fis.close();
ServerSocket s = new ServerSocket();
- assertTrue(S_ISSOCK(Libcore.os.fstat(s.getImpl().getFileDescriptor()).st_mode));
+ assertTrue(S_ISSOCK(Libcore.os.fstat(s.getImpl().getFD$()).st_mode));
s.close();
}
diff --git a/luni/src/test/java/libcore/java/io/FileDescriptorTest.java b/luni/src/test/java/libcore/java/io/FileDescriptorTest.java
index adaa931..3e82690 100644
--- a/luni/src/test/java/libcore/java/io/FileDescriptorTest.java
+++ b/luni/src/test/java/libcore/java/io/FileDescriptorTest.java
@@ -37,7 +37,7 @@
fis.close();
ServerSocket s = new ServerSocket();
- assertTrue(s.getImpl().getFileDescriptor().isSocket$());
+ assertTrue(s.getImpl().getFD$().isSocket$());
s.close();
}
}
diff --git a/luni/src/test/java/libcore/java/sql/OldPreparedStatementTest.java b/luni/src/test/java/libcore/java/sql/OldPreparedStatementTest.java
index 8fd8665..9c99e62 100755
--- a/luni/src/test/java/libcore/java/sql/OldPreparedStatementTest.java
+++ b/luni/src/test/java/libcore/java/sql/OldPreparedStatementTest.java
@@ -272,8 +272,7 @@
String[] queries2 = {
"update zoo set name='Masha', family='cat' where id=;",
"insert into hutch (id, animal_id, address) values (1, ?,'Birds-house, 1');",
- "insert into hutch (id, animal_id, address) values (?, 1, 'Horse-house, 5');",
- "create view address as select address from hutch where animal_id=?"};
+ "insert into hutch (id, animal_id, address) values (?, 1, 'Horse-house, 5');"};
for (int i = 0; i < queries2.length; i++) {
PreparedStatement ps = null;
@@ -324,41 +323,40 @@
// TODO Crashes VM. Fix later.
public void testExecuteUpdate() throws SQLException {
- String[] queries1 = { "insert into hutch (id, animal_id, address) values (1, ?, 'Birds-house, 1');",
- "insert into hutch (id, animal_id, address) values (?, 1, 'Horse-house, 5');",
- "create view address as select address from hutch where animal_id=2" };
+ String[] queries1 = { "insert into hutch (id, animal_id, address) values (1, ?, 'Birds-house, 1');",
+ "insert into hutch (id, animal_id, address) values (?, 1, 'Horse-house, 5');"};
- for (int i = 0; i < queries1.length; i++) {
- PreparedStatement ps = null;
- try {
- ps = conn.prepareStatement(queries1[i]);
- ps.executeUpdate();
- fail("SQLException is not thrown for query: " + queries1[i]);
- } catch(SQLException sqle) {
- // expected
- } finally {
- try {
- ps.close();
- } catch(Exception ee) {}
- }
- }
+ for (int i = 0; i < queries1.length; i++) {
+ PreparedStatement ps = null;
+ try {
+ ps = conn.prepareStatement(queries1[i]);
+ ps.executeUpdate();
+ fail("SQLException is not thrown for query: " + queries1[i]);
+ } catch(SQLException sqle) {
+ // expected
+ } finally {
+ try {
+ ps.close();
+ } catch(Exception ee) {}
+ }
+ }
- String query = "update zoo set name='Masha', family='cat' where id=?;";
- PreparedStatement ps = null;
- try {
- ps = conn.prepareStatement(query);
- ps.setInt(1, 2);
- int updateCount = ps.executeUpdate();
- assertEquals(1, updateCount);
- ps.setInt(1, 1);
- int updateCount1 = ps.executeUpdate();
- assertEquals(1, updateCount1);
- } finally {
- try {
- ps.close();
- } catch(Exception ee) {}
- }
- }
+ String query = "update zoo set name='Masha', family='cat' where id=?;";
+ PreparedStatement ps = null;
+ try {
+ ps = conn.prepareStatement(query);
+ ps.setInt(1, 2);
+ int updateCount = ps.executeUpdate();
+ assertEquals(1, updateCount);
+ ps.setInt(1, 1);
+ int updateCount1 = ps.executeUpdate();
+ assertEquals(1, updateCount1);
+ } finally {
+ try {
+ ps.close();
+ } catch(Exception ee) {}
+ }
+ }
/**
* TODO Doesn't pass. according to spec, it is possible to invoke the
diff --git a/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java b/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
index c7667b9..bf10c3e 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
@@ -145,23 +145,28 @@
zipFile.close();
}
- public void testMaxLengthExtra_zip64() throws Exception {
- // Not quite the max length (65535), but large enough that there's no space
- // for the zip64 extended info header.
- byte[] maxLengthExtra = new byte[65530];
- File f = createTemporaryZipFile();
- ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(f)),
- true /* forceZip64 */);
- ZipEntry ze = new ZipEntry("x");
-
- ze.setExtra(maxLengthExtra);
- try {
- out.putNextEntry(ze);
- fail();
- } catch (ZipException expected) {
- }
- }
+ // TODO: This test does not compile because we need to add a ZipOutputStream constructor
+ // that forces zip64. This also needs followup changes in ZipInputStream et al. to assume zip64
+ // if the header says so, and to not depend purely on the entry length.
+ //
+ // public void testMaxLengthExtra_zip64() throws Exception {
+ // // Not quite the max length (65535), but large enough that there's no space
+ // // for the zip64 extended info header.
+ // byte[] maxLengthExtra = new byte[65530];
+ //
+ // File f = createTemporaryZipFile();
+ // ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(f)),
+ // true /* forceZip64 */);
+ // ZipEntry ze = new ZipEntry("x");
+ //
+ // ze.setExtra(maxLengthExtra);
+ // try {
+ // out.putNextEntry(ze);
+ // fail();
+ // } catch (ZipException expected) {
+ // }
+ // }
public void testTooLongComment() throws Exception {
diff --git a/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDSA.java b/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDSA.java
index 24820ed..4918fdc 100644
--- a/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDSA.java
+++ b/luni/src/test/java/libcore/javax/crypto/spec/AlgorithmParametersTestDSA.java
@@ -22,46 +22,78 @@
public class AlgorithmParametersTestDSA extends AlgorithmParametersTest {
+ /*
+ * Parameters generated with OpenSSL:
+ * openssl dsaparam -genkey 1024 -C
+ */
private static final byte[] P = new byte[] {
- (byte) 0x00, (byte) 0xB9, (byte) 0x53, (byte) 0xA4, (byte) 0xBB,
- (byte) 0xC8, (byte) 0xFD, (byte) 0x94, (byte) 0x4B, (byte) 0xC0,
- (byte) 0xD4, (byte) 0x6B, (byte) 0xA9, (byte) 0xAB, (byte) 0x5A,
- (byte) 0x1E, (byte) 0x85, (byte) 0x7E, (byte) 0x87, (byte) 0x38,
- (byte) 0x79, (byte) 0x1C, (byte) 0xBF, (byte) 0xCF, (byte) 0x32,
- (byte) 0x5A, (byte) 0x45, (byte) 0xF8, (byte) 0xE4, (byte) 0x08,
- (byte) 0x28, (byte) 0xA4, (byte) 0x12, (byte) 0x8A, (byte) 0x9D,
- (byte) 0x06, (byte) 0x53, (byte) 0x1C, (byte) 0xAA, (byte) 0x6A,
- (byte) 0x21, (byte) 0xC1, (byte) 0x95, (byte) 0xF8, (byte) 0xAA,
- (byte) 0xB2, (byte) 0xB8, (byte) 0x43, (byte) 0x38, (byte) 0x86,
- (byte) 0x15, (byte) 0x94, (byte) 0xCF, (byte) 0x40, (byte) 0xA5,
- (byte) 0x0D, (byte) 0xF3, (byte) 0x9A, (byte) 0x49, (byte) 0x12,
- (byte) 0x72, (byte) 0x64, (byte) 0x11, (byte) 0xDD, (byte) 0x85};
+ (byte) 0xE6, (byte) 0x41, (byte) 0x58, (byte) 0x77, (byte) 0x76,
+ (byte) 0x5A, (byte) 0x4A, (byte) 0x53, (byte) 0xF1, (byte) 0xD6,
+ (byte) 0xC8, (byte) 0x7D, (byte) 0x67, (byte) 0x1F, (byte) 0x2F,
+ (byte) 0xFA, (byte) 0xDE, (byte) 0xB7, (byte) 0xAA, (byte) 0xCD,
+ (byte) 0xD7, (byte) 0x5D, (byte) 0xD0, (byte) 0xE9, (byte) 0xB1,
+ (byte) 0xDA, (byte) 0xFE, (byte) 0x42, (byte) 0xBE, (byte) 0xCC,
+ (byte) 0x42, (byte) 0x52, (byte) 0x2E, (byte) 0x01, (byte) 0xD2,
+ (byte) 0x16, (byte) 0xB1, (byte) 0x5B, (byte) 0xC4, (byte) 0x42,
+ (byte) 0xF9, (byte) 0x55, (byte) 0x0F, (byte) 0xE2, (byte) 0xD5,
+ (byte) 0x01, (byte) 0xD2, (byte) 0x7E, (byte) 0x22, (byte) 0xF6,
+ (byte) 0xC1, (byte) 0xFE, (byte) 0x5C, (byte) 0x6A, (byte) 0xCF,
+ (byte) 0x82, (byte) 0x1B, (byte) 0x5C, (byte) 0x46, (byte) 0x66,
+ (byte) 0x8B, (byte) 0xAF, (byte) 0xDF, (byte) 0x44, (byte) 0xE2,
+ (byte) 0x0E, (byte) 0xA3, (byte) 0x58, (byte) 0xF7, (byte) 0xA3,
+ (byte) 0x24, (byte) 0xE3, (byte) 0x84, (byte) 0xA6, (byte) 0x16,
+ (byte) 0xE0, (byte) 0xCA, (byte) 0x72, (byte) 0x55, (byte) 0x07,
+ (byte) 0xA0, (byte) 0x99, (byte) 0x7B, (byte) 0xF8, (byte) 0xB1,
+ (byte) 0x5A, (byte) 0x84, (byte) 0x36, (byte) 0x5A, (byte) 0xC8,
+ (byte) 0x6A, (byte) 0xFE, (byte) 0xA6, (byte) 0xB4, (byte) 0x1B,
+ (byte) 0x3A, (byte) 0x0A, (byte) 0x00, (byte) 0x6B, (byte) 0x72,
+ (byte) 0xDC, (byte) 0x0C, (byte) 0xD1, (byte) 0x09, (byte) 0x25,
+ (byte) 0x11, (byte) 0x68, (byte) 0x6B, (byte) 0x75, (byte) 0xDE,
+ (byte) 0x2C, (byte) 0x1A, (byte) 0xC2, (byte) 0x3A, (byte) 0xCB,
+ (byte) 0xA0, (byte) 0x17, (byte) 0xCA, (byte) 0x2D, (byte) 0xEE,
+ (byte) 0xA2, (byte) 0x5A, (byte) 0x9D, (byte) 0x1F, (byte) 0x33,
+ (byte) 0x1B, (byte) 0x07, (byte) 0x6D,
+ };
private static final byte[] Q = new byte[] {
- (byte) 0x00, (byte) 0xF8, (byte) 0x51, (byte) 0x6A, (byte) 0x92,
- (byte) 0xCB, (byte) 0x47, (byte) 0x95, (byte) 0x18, (byte) 0x1F,
- (byte) 0x7E, (byte) 0xD8, (byte) 0x71, (byte) 0x05, (byte) 0xB6,
- (byte) 0x26, (byte) 0x4D, (byte) 0x52, (byte) 0x94, (byte) 0xFA,
- (byte) 0x5D};
+ (byte) 0x9B, (byte) 0x39, (byte) 0xD0, (byte) 0x02, (byte) 0x0F,
+ (byte) 0xE9, (byte) 0x96, (byte) 0x16, (byte) 0xC5, (byte) 0x25,
+ (byte) 0xF7, (byte) 0x94, (byte) 0xA9, (byte) 0x2C, (byte) 0xD0,
+ (byte) 0x25, (byte) 0x5B, (byte) 0x6E, (byte) 0xE0, (byte) 0x8F,
+ };
private static final byte[] G = new byte[] {
- (byte) 0x2B, (byte) 0xF5, (byte) 0x91, (byte) 0x47, (byte) 0xC8,
- (byte) 0xF1, (byte) 0x79, (byte) 0x75, (byte) 0x2A, (byte) 0x8E,
- (byte) 0x40, (byte) 0x7E, (byte) 0xF5, (byte) 0xA5, (byte) 0x14,
- (byte) 0x98, (byte) 0x97, (byte) 0xE8, (byte) 0xC5, (byte) 0x5E,
- (byte) 0x7A, (byte) 0x39, (byte) 0xFE, (byte) 0x3B, (byte) 0x68,
- (byte) 0x06, (byte) 0x85, (byte) 0xD4, (byte) 0xDC, (byte) 0xA5,
- (byte) 0xF1, (byte) 0xC1, (byte) 0x82, (byte) 0x45, (byte) 0x98,
- (byte) 0xD3, (byte) 0x06, (byte) 0xE2, (byte) 0x4A, (byte) 0x45,
- (byte) 0xD7, (byte) 0xF5, (byte) 0x57, (byte) 0x18, (byte) 0x55,
- (byte) 0x05, (byte) 0xD4, (byte) 0x74, (byte) 0x6A, (byte) 0x9E,
- (byte) 0x2D, (byte) 0x42, (byte) 0xDF, (byte) 0xC2, (byte) 0x88,
- (byte) 0x95, (byte) 0x97, (byte) 0xA8, (byte) 0x7D, (byte) 0x11,
- (byte) 0x55, (byte) 0x9C, (byte) 0x7C, (byte) 0x9F};
+ (byte) 0x5E, (byte) 0x9C, (byte) 0x95, (byte) 0x5F, (byte) 0x7E,
+ (byte) 0x91, (byte) 0x47, (byte) 0x4D, (byte) 0x68, (byte) 0xA4,
+ (byte) 0x1C, (byte) 0x44, (byte) 0x3B, (byte) 0xEC, (byte) 0x0A,
+ (byte) 0x7E, (byte) 0x59, (byte) 0x54, (byte) 0xF7, (byte) 0xEF,
+ (byte) 0x42, (byte) 0xFB, (byte) 0x63, (byte) 0x95, (byte) 0x08,
+ (byte) 0x2F, (byte) 0x4A, (byte) 0xD3, (byte) 0xBC, (byte) 0x79,
+ (byte) 0x9D, (byte) 0xBA, (byte) 0xD8, (byte) 0x8A, (byte) 0x83,
+ (byte) 0x84, (byte) 0xAE, (byte) 0x5B, (byte) 0x26, (byte) 0x80,
+ (byte) 0xB3, (byte) 0xFB, (byte) 0x9C, (byte) 0xA3, (byte) 0xCF,
+ (byte) 0xF4, (byte) 0x0A, (byte) 0xD5, (byte) 0xB6, (byte) 0x65,
+ (byte) 0x65, (byte) 0x1A, (byte) 0x4F, (byte) 0xC0, (byte) 0x86,
+ (byte) 0x3B, (byte) 0xE6, (byte) 0xFB, (byte) 0x4E, (byte) 0x9E,
+ (byte) 0x49, (byte) 0x0A, (byte) 0x8C, (byte) 0x77, (byte) 0x2D,
+ (byte) 0x93, (byte) 0x0B, (byte) 0xCA, (byte) 0x81, (byte) 0x07,
+ (byte) 0x09, (byte) 0xC4, (byte) 0x71, (byte) 0xFD, (byte) 0xC8,
+ (byte) 0xC7, (byte) 0xD1, (byte) 0xA3, (byte) 0xD0, (byte) 0xBB,
+ (byte) 0x7D, (byte) 0x92, (byte) 0x74, (byte) 0x8B, (byte) 0x3B,
+ (byte) 0x2A, (byte) 0x45, (byte) 0x1F, (byte) 0x5D, (byte) 0x85,
+ (byte) 0x90, (byte) 0xE3, (byte) 0xFB, (byte) 0x0E, (byte) 0x16,
+ (byte) 0xBA, (byte) 0x8A, (byte) 0xDE, (byte) 0x10, (byte) 0x0F,
+ (byte) 0xE0, (byte) 0x0F, (byte) 0x37, (byte) 0xA7, (byte) 0xC1,
+ (byte) 0xDC, (byte) 0xBC, (byte) 0x00, (byte) 0xB8, (byte) 0x24,
+ (byte) 0x0F, (byte) 0xF6, (byte) 0x5F, (byte) 0xB1, (byte) 0xA8,
+ (byte) 0x9A, (byte) 0xDB, (byte) 0x9F, (byte) 0x36, (byte) 0x54,
+ (byte) 0x45, (byte) 0xBD, (byte) 0xC0, (byte) 0xE8, (byte) 0x27,
+ (byte) 0x82, (byte) 0xC9, (byte) 0x75,
+ };
public AlgorithmParametersTestDSA() {
super("DSA", new AlgorithmParameterSignatureHelper<DSAParameterSpec>(
"DSA", DSAParameterSpec.class), new DSAParameterSpec(
- new BigInteger(P), new BigInteger(Q), new BigInteger(G)));
+ new BigInteger(1, P), new BigInteger(1, Q), new BigInteger(1, G)));
}
}
diff --git a/ojluni/src/main/java/java/lang/System.java b/ojluni/src/main/java/java/lang/System.java
index 4635ae5..f296bf8 100755
--- a/ojluni/src/main/java/java/lang/System.java
+++ b/ojluni/src/main/java/java/lang/System.java
@@ -106,6 +106,22 @@
public final static PrintStream err;
/**
+ * Dedicated lock for GC / Finalization logic.
+ */
+ private static final Object LOCK = new Object();
+
+ /**
+ * Whether or not we need to do a GC before running the finalizers.
+ */
+ private static boolean runGC;
+
+ /**
+ * If we just ran finalization, we might want to do a GC to free the finalized objects.
+ * This lets us do gc/runFinlization/gc sequences but prevents back to back System.gc().
+ */
+ private static boolean justRanFinalization;
+
+ /**
* Reassigns the "standard" input stream.
*
* <p>First, if there is a security manager, its <code>checkPermission</code>
@@ -1497,7 +1513,18 @@
* @see java.lang.Runtime#gc()
*/
public static void gc() {
- Runtime.getRuntime().gc();
+ boolean shouldRunGC;
+ synchronized (LOCK) {
+ shouldRunGC = justRanFinalization;
+ if (shouldRunGC) {
+ justRanFinalization = false;
+ } else {
+ runGC = true;
+ }
+ }
+ if (shouldRunGC) {
+ Runtime.getRuntime().gc();
+ }
}
/**
@@ -1519,7 +1546,18 @@
* @see java.lang.Runtime#runFinalization()
*/
public static void runFinalization() {
+ boolean shouldRunGC;
+ synchronized (LOCK) {
+ shouldRunGC = runGC;
+ runGC = false;
+ }
+ if (shouldRunGC) {
+ Runtime.getRuntime().gc();
+ }
Runtime.getRuntime().runFinalization();
+ synchronized (LOCK) {
+ justRanFinalization = true;
+ }
}
/**
diff --git a/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java b/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java
index e7ad94c..8133554 100755
--- a/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java
+++ b/ojluni/src/main/java/java/net/AbstractPlainDatagramSocketImpl.java
@@ -304,8 +304,11 @@
throw new SocketException("bad argument for IP_MULTICAST_IF");
break;
case IP_MULTICAST_IF2:
- if (o == null || !(o instanceof NetworkInterface))
+ if (o == null || !(o instanceof Integer || o instanceof NetworkInterface))
throw new SocketException("bad argument for IP_MULTICAST_IF2");
+ if (o instanceof NetworkInterface) {
+ o = new Integer(((NetworkInterface)o).getIndex());
+ }
break;
case IP_MULTICAST_LOOP:
if (o == null || !(o instanceof Boolean))
@@ -349,6 +352,10 @@
case SO_REUSEADDR:
case SO_BROADCAST:
result = socketGetOption(optID);
+
+ if (optID == IP_MULTICAST_IF) {
+ return getNIFirstAddress((Integer)result);
+ }
break;
default:
@@ -358,6 +365,20 @@
return result;
}
+ /** Return the first address bound to NetworkInterface with given ID.
+ * In case of niIndex == 0 or no address return anyLocalAddress
+ */
+ static InetAddress getNIFirstAddress(int niIndex) throws SocketException {
+ if (niIndex > 0) {
+ NetworkInterface networkInterface = NetworkInterface.getByIndex(niIndex);
+ Enumeration<InetAddress> addressesEnum = networkInterface.getInetAddresses();
+ if (addressesEnum.hasMoreElements()) {
+ return addressesEnum.nextElement();
+ }
+ }
+ return InetAddress.anyLocalAddress();
+ }
+
protected abstract void datagramSocketCreate() throws SocketException;
protected abstract void datagramSocketClose();
protected abstract void socketSetOption(int opt, Object val)
diff --git a/ojluni/src/main/java/java/net/Inet4Address.java b/ojluni/src/main/java/java/net/Inet4Address.java
index 11ee7c7..57da1c4 100755
--- a/ojluni/src/main/java/java/net/Inet4Address.java
+++ b/ojluni/src/main/java/java/net/Inet4Address.java
@@ -332,11 +332,6 @@
return addr;
}
- @Override
- public byte[] getAddressInternal() {
- return getAddress();
- }
-
/**
* Returns the IP address string in textual presentation form.
*
diff --git a/ojluni/src/main/java/java/net/Inet6Address.java b/ojluni/src/main/java/java/net/Inet6Address.java
index 67487ff..ca19211 100755
--- a/ojluni/src/main/java/java/net/Inet6Address.java
+++ b/ojluni/src/main/java/java/net/Inet6Address.java
@@ -622,11 +622,6 @@
return ipaddress.clone();
}
- @Override
- public byte[] getAddressInternal() {
- return ipaddress;
- }
-
/**
* Returns the numeric scopeId, if this instance is associated with
* an interface. If no scoped_id is set, the returned value is zero.
diff --git a/ojluni/src/main/java/java/net/InetAddress.java b/ojluni/src/main/java/java/net/InetAddress.java
index 019c4ac..d8057ff 100755
--- a/ojluni/src/main/java/java/net/InetAddress.java
+++ b/ojluni/src/main/java/java/net/InetAddress.java
@@ -577,16 +577,6 @@
}
/**
- * Called from native code. Same as {@code getAddress}, but for internal users.
- *
- * @return
- */
- public byte[] getAddressInternal() {
- return null;
- }
-
-
- /**
* Returns the IP address string in textual presentation.
*
* @return the raw IP address in a string format.
@@ -1005,4 +995,4 @@
String getHostName(boolean check) {
throw new UnsupportedOperationException();
}
-}
\ No newline at end of file
+}
diff --git a/ojluni/src/main/java/java/net/MulticastSocket.java b/ojluni/src/main/java/java/net/MulticastSocket.java
index 28bc58e..f39d3e9 100755
--- a/ojluni/src/main/java/java/net/MulticastSocket.java
+++ b/ojluni/src/main/java/java/net/MulticastSocket.java
@@ -563,14 +563,14 @@
* @since 1.4
*/
public NetworkInterface getNetworkInterface() throws SocketException {
- NetworkInterface ni
- = (NetworkInterface)getImpl().getOption(SocketOptions.IP_MULTICAST_IF2);
- if (ni.getIndex() == 0) {
+ Integer niIndex
+ = (Integer)getImpl().getOption(SocketOptions.IP_MULTICAST_IF2);
+ if (niIndex == 0) {
InetAddress[] addrs = new InetAddress[1];
addrs[0] = InetAddress.anyLocalAddress();
return new NetworkInterface(addrs[0].getHostName(), 0, addrs);
} else {
- return ni;
+ return NetworkInterface.getByIndex(niIndex);
}
}
diff --git a/ojluni/src/main/java/java/net/SocketImpl.java b/ojluni/src/main/java/java/net/SocketImpl.java
index 18044ab..d2123e2 100755
--- a/ojluni/src/main/java/java/net/SocketImpl.java
+++ b/ojluni/src/main/java/java/net/SocketImpl.java
@@ -222,7 +222,14 @@
* @return the value of this socket's <code>fd</code> field.
* @see java.net.SocketImpl#fd
*/
- public FileDescriptor getFileDescriptor() {
+ protected FileDescriptor getFileDescriptor() {
+ return fd;
+ }
+
+ /**
+ * @hide used by java.nio tests
+ */
+ public FileDescriptor getFD$() {
return fd;
}
diff --git a/ojluni/src/main/native/PlainDatagramSocketImpl.c b/ojluni/src/main/native/PlainDatagramSocketImpl.c
index f64d269..f4857df 100755
--- a/ojluni/src/main/native/PlainDatagramSocketImpl.c
+++ b/ojluni/src/main/native/PlainDatagramSocketImpl.c
@@ -58,7 +58,6 @@
#include "java_net_SocketOptions.h"
#include "java_net_PlainDatagramSocketImpl.h"
-#include "java_net_NetworkInterface.h"
#include "JNIHelp.h"
#define NATIVE_METHOD(className, functionName, signature) \
@@ -1065,55 +1064,19 @@
/*
- * Set outgoing multicast interface designated by a NetworkInterface.
+ * Set outgoing multicast interface designated by a NetworkInterface index.
* Throw exception if failed.
*
* Android changed: return 0 on success, negative on failure.
+ * Android changed: Interface index (not NetworkInterface) as the parameter
*/
-static int mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jobject value) {
- static jfieldID ni_addrsID;
- struct in_addr in;
- jobjectArray addrArray;
- jsize len;
- jobject addr;
- int i;
-
- if (ni_addrsID == NULL ) {
- jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
- // Android-changed: return -1 if null.
- CHECK_NULL_RETURN(c, -1);
- ni_addrsID = (*env)->GetFieldID(env, c, "addrs",
- "[Ljava/net/InetAddress;");
- // Android-changed: return -1 if null.
- CHECK_NULL_RETURN(ni_addrsID, -1);
- }
-
- addrArray = (*env)->GetObjectField(env, value, ni_addrsID);
- len = (*env)->GetArrayLength(env, addrArray);
-
- /*
- * Check that there is at least one address bound to this
- * interface.
- */
- if (len < 1) {
- JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
- "bad argument for IP_MULTICAST_IF2: No IP addresses bound to interface");
- return -1;
- }
-
- /*
- * We need an ipv4 address here
- */
- for (i = 0; i < len; i++) {
- addr = (*env)->GetObjectArrayElement(env, addrArray, i);
- if (getInetAddress_family(env, addr) == IPv4) {
- in.s_addr = htonl(getInetAddress_addr(env, addr));
- break;
- }
- }
+static int mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jint ifindex) {
+ struct ip_mreqn req;
+ memset(&req, 0, sizeof(req));
+ req.imr_ifindex = ifindex;
if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
- (const char*)&in, sizeof(in)) < 0) {
+ (const char*)&req, sizeof(req)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
"Error setting socket option");
return -1;
@@ -1125,23 +1088,12 @@
/*
* Set outgoing multicast interface designated by a NetworkInterface.
* Throw exception if failed.
+ * Android changed: Interface index (not NetworkInterface) as the parameter
*/
-#ifdef AF_INET6
-static void mcast_set_if_by_if_v6(JNIEnv *env, jobject this, int fd, jobject value) {
- static jfieldID ni_indexID;
- int index;
-
- if (ni_indexID == NULL) {
- jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
- CHECK_NULL(c);
- ni_indexID = (*env)->GetFieldID(env, c, "index", "I");
- CHECK_NULL(ni_indexID);
- }
- index = (*env)->GetIntField(env, value, ni_indexID);
-
+static void mcast_set_if_by_if_v6(JNIEnv *env, jobject this, int fd, jint ifindex) {
if (JVM_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
- (const char*)&index, sizeof(index)) < 0) {
- if (errno == EINVAL && index > 0) {
+ (const char*)&ifindex, sizeof(ifindex)) < 0) {
+ if (errno == EINVAL && ifindex > 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"IPV6_MULTICAST_IF failed (interface has IPv4 "
"address only?)");
@@ -1151,9 +1103,7 @@
}
return;
}
-
}
-#endif /* AF_INET6 */
/*
* Set outgoing multicast interface designated by an InetAddress.
@@ -1180,18 +1130,29 @@
* Set outgoing multicast interface designated by an InetAddress.
* Throw exception if failed.
*/
-#ifdef AF_INET6
static void mcast_set_if_by_addr_v6(JNIEnv *env, jobject this, int fd, jobject value) {
static jclass ni_class;
+ static jmethodID ni_getByInetAddress;
+ static jmethodID ni_getIndex;
if (ni_class == NULL) {
jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
CHECK_NULL(c);
ni_class = (*env)->NewGlobalRef(env, c);
CHECK_NULL(ni_class);
+ ni_getByInetAddress = (*env)->GetStaticMethodID(
+ env, ni_class, "getByInetAddress", "(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;");
+ CHECK_NULL(ni_getByInetAddress);
+ ni_getIndex = (*env)->GetMethodID(
+ env, ni_class, "getIndex", "()I");
+ CHECK_NULL(ni_getIndex);
}
- value = NetworkInterface_getByInetAddress0(env, ni_class, value);
- if (value == NULL) {
+ /*
+ * Get the NetworkInterface by inetAddress
+ */
+ jobject ni_value = (*env)->CallStaticObjectMethod(
+ env, ni_class, ni_getByInetAddress, value);
+ if (ni_value == NULL) {
if (!(*env)->ExceptionOccurred(env)) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"bad argument for IP_MULTICAST_IF"
@@ -1200,9 +1161,16 @@
return;
}
- mcast_set_if_by_if_v6(env, this, fd, value);
+ /*
+ * Get the NetworkInterface index
+ */
+ jint ifindex = (*env)->CallIntMethod(env, ni_value, ni_getIndex);
+ if ((*env)->ExceptionOccurred(env)) {
+ return;
+ }
+
+ mcast_set_if_by_if_v6(env, this, fd, ifindex);
}
-#endif
/*
* Sets the multicast interface.
@@ -1238,8 +1206,6 @@
/*
* value is an InetAddress.
*/
-#ifdef AF_INET6
-#ifdef __linux__
// Android-changed: Return early if mcast_set_if_by_addr_v4 threw.
// We don't want to call into the IPV6 code with a pending exception.
if (mcast_set_if_by_addr_v4(env, this, fd, value)) {
@@ -1248,42 +1214,29 @@
if (ipv6_available()) {
mcast_set_if_by_addr_v6(env, this, fd, value);
}
-#else /* __linux__ not defined */
- if (ipv6_available()) {
- mcast_set_if_by_addr_v6(env, this, fd, value);
- } else {
- mcast_set_if_by_addr_v4(env, this, fd, value);
- }
-#endif /* __linux__ */
-#else
- mcast_set_if_by_addr_v4(env, this, fd, value);
-#endif /* AF_INET6 */
}
if (opt == java_net_SocketOptions_IP_MULTICAST_IF2) {
- /*
- * value is a NetworkInterface.
+ /*
+ * value is a Integer (Android-changed, openJdk uses NetworkInterface)
*/
-#ifdef AF_INET6
-#ifdef __linux__
+ static jfieldID integer_valueID;
+ if (integer_valueID == NULL) {
+ jclass c = (*env)->FindClass(env, "java/lang/Integer");
+ CHECK_NULL(c);
+ integer_valueID = (*env)->GetFieldID(env, c, "value", "I");
+ CHECK_NULL(integer_valueID);
+ }
+ int index = (*env)->GetIntField(env, value, integer_valueID);
+
// Android-changed: Return early if mcast_set_if_by_addr_v4 threw.
// We don't want to call into the IPV6 code with a pending exception.
- if (mcast_set_if_by_if_v4(env, this, fd, value)) {
+ if (mcast_set_if_by_if_v4(env, this, fd, index)) {
return;
}
if (ipv6_available()) {
- mcast_set_if_by_if_v6(env, this, fd, value);
+ mcast_set_if_by_if_v6(env, this, fd, index);
}
-#else /* __linux__ not defined */
- if (ipv6_available()) {
- mcast_set_if_by_if_v6(env, this, fd, value);
- } else {
- mcast_set_if_by_if_v4(env, this, fd, value);
- }
-#endif /* __linux__ */
-#else
- mcast_set_if_by_if_v4(env, this, fd, value);
-#endif /* AF_INET6 */
}
}
@@ -1500,128 +1453,11 @@
* return NetworkInterface.
*/
jobject getMulticastInterface(JNIEnv *env, jobject this, int fd, jint opt) {
- jboolean isIPV4 = JNI_TRUE;
-
-#ifdef AF_INET6
- if (ipv6_available()) {
- isIPV4 = JNI_FALSE;
- }
-#endif
-
- /*
- * IPv4 implementation
- */
- if (isIPV4) {
- static jclass inet4_class;
- static jmethodID inet4_ctrID;
-
- static jclass ni_class;
- static jmethodID ni_ctrID;
- static jfieldID ni_indexID;
- static jfieldID ni_addrsID;
-
- jobjectArray addrArray;
- jobject addr;
- jobject ni;
-
- struct in_addr in;
- struct in_addr *inP = ∈
- int len = sizeof(struct in_addr);
-
-#ifdef __linux__
- struct ip_mreqn mreqn;
-#endif
-
- if (JVM_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
- (char *)inP, &len) < 0) {
- NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
- "Error getting socket option");
- return NULL;
- }
-
- /*
- * Construct and populate an Inet4Address
- */
- if (inet4_class == NULL) {
- jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
- CHECK_NULL_RETURN(c, NULL);
- inet4_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V");
- CHECK_NULL_RETURN(inet4_ctrID, NULL);
- inet4_class = (*env)->NewGlobalRef(env, c);
- CHECK_NULL_RETURN(inet4_class, NULL);
- }
- addr = (*env)->NewObject(env, inet4_class, inet4_ctrID, 0);
- CHECK_NULL_RETURN(addr, NULL);
-
- setInetAddress_addr(env, addr, ntohl(in.s_addr));
-
- /*
- * For IP_MULTICAST_IF return InetAddress
- */
- if (opt == java_net_SocketOptions_IP_MULTICAST_IF) {
- return addr;
- }
-
- /*
- * For IP_MULTICAST_IF2 we get the NetworkInterface for
- * this address and return it
- */
- if (ni_class == NULL) {
- jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
- CHECK_NULL_RETURN(c, NULL);
- ni_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V");
- CHECK_NULL_RETURN(ni_ctrID, NULL);
- ni_indexID = (*env)->GetFieldID(env, c, "index", "I");
- CHECK_NULL_RETURN(ni_indexID, NULL);
- ni_addrsID = (*env)->GetFieldID(env, c, "addrs",
- "[Ljava/net/InetAddress;");
- CHECK_NULL_RETURN(ni_addrsID, NULL);
- ni_class = (*env)->NewGlobalRef(env, c);
- CHECK_NULL_RETURN(ni_class, NULL);
- }
- ni = NetworkInterface_getByInetAddress0(env, ni_class, addr);
- if (ni) {
- return ni;
- }
-
- /*
- * The address doesn't appear to be bound at any known
- * NetworkInterface. Therefore we construct a NetworkInterface
- * with this address.
- */
- ni = (*env)->NewObject(env, ni_class, ni_ctrID, 0);
- CHECK_NULL_RETURN(ni, NULL);
-
- (*env)->SetIntField(env, ni, ni_indexID, -1);
- addrArray = (*env)->NewObjectArray(env, 1, inet4_class, NULL);
- CHECK_NULL_RETURN(addrArray, NULL);
- (*env)->SetObjectArrayElement(env, addrArray, 0, addr);
- (*env)->SetObjectField(env, ni, ni_addrsID, addrArray);
- return ni;
- }
-
-
-#ifdef AF_INET6
- /*
- * IPv6 implementation
- */
- if ((opt == java_net_SocketOptions_IP_MULTICAST_IF) ||
- (opt == java_net_SocketOptions_IP_MULTICAST_IF2)) {
-
- static jclass ni_class;
- static jmethodID ni_ctrID;
- static jfieldID ni_indexID;
- static jfieldID ni_addrsID;
- static jclass ia_class;
- static jmethodID ia_anyLocalAddressID;
-
+ if ((opt == java_net_SocketOptions_IP_MULTICAST_IF2) ||
+ (opt == java_net_SocketOptions_IP_MULTICAST_IF)) {
int index;
int len = sizeof(index);
- jobjectArray addrArray;
- jobject addr;
- jobject ni;
-
{
if (JVM_GetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
@@ -1631,89 +1467,10 @@
}
}
- if (ni_class == NULL) {
- jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
- CHECK_NULL_RETURN(c, NULL);
- ni_ctrID = (*env)->GetMethodID(env, c, "<init>", "()V");
- CHECK_NULL_RETURN(ni_ctrID, NULL);
- ni_indexID = (*env)->GetFieldID(env, c, "index", "I");
- CHECK_NULL_RETURN(ni_indexID, NULL);
- ni_addrsID = (*env)->GetFieldID(env, c, "addrs",
- "[Ljava/net/InetAddress;");
- CHECK_NULL_RETURN(ni_addrsID, NULL);
-
- ia_class = (*env)->FindClass(env, "java/net/InetAddress");
- CHECK_NULL_RETURN(ia_class, NULL);
- ia_class = (*env)->NewGlobalRef(env, ia_class);
- CHECK_NULL_RETURN(ia_class, NULL);
- ia_anyLocalAddressID = (*env)->GetStaticMethodID(env,
- ia_class,
- "anyLocalAddress",
- "()Ljava/net/InetAddress;");
- CHECK_NULL_RETURN(ia_anyLocalAddressID, NULL);
- ni_class = (*env)->NewGlobalRef(env, c);
- CHECK_NULL_RETURN(ni_class, NULL);
- }
-
- /*
- * If multicast to a specific interface then return the
- * interface (for IF2) or the any address on that interface
- * (for IF).
- */
- if (index > 0) {
- ni = NetworkInterface_getByIndex0(env, ni_class,
- index);
- if (ni == NULL) {
- char errmsg[255];
- sprintf(errmsg,
- "IPV6_MULTICAST_IF returned index to unrecognized interface: %d",
- index);
- JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", errmsg);
- return NULL;
- }
-
- /*
- * For IP_MULTICAST_IF2 return the NetworkInterface
- */
- if (opt == java_net_SocketOptions_IP_MULTICAST_IF2) {
- return ni;
- }
-
- /*
- * For IP_MULTICAST_IF return addrs[0]
- */
- addrArray = (*env)->GetObjectField(env, ni, ni_addrsID);
- if ((*env)->GetArrayLength(env, addrArray) < 1) {
- JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
- "IPV6_MULTICAST_IF returned interface without IP bindings");
- return NULL;
- }
-
- addr = (*env)->GetObjectArrayElement(env, addrArray, 0);
- return addr;
- }
-
- /*
- * Multicast to any address - return anyLocalAddress
- * or a NetworkInterface with addrs[0] set to anyLocalAddress
- */
-
- addr = (*env)->CallStaticObjectMethod(env, ia_class, ia_anyLocalAddressID,
- NULL);
- if (opt == java_net_SocketOptions_IP_MULTICAST_IF) {
- return addr;
- }
-
- ni = (*env)->NewObject(env, ni_class, ni_ctrID, 0);
- CHECK_NULL_RETURN(ni, NULL);
- (*env)->SetIntField(env, ni, ni_indexID, -1);
- addrArray = (*env)->NewObjectArray(env, 1, ia_class, NULL);
- CHECK_NULL_RETURN(addrArray, NULL);
- (*env)->SetObjectArrayElement(env, addrArray, 0, addr);
- (*env)->SetObjectField(env, ni, ni_addrsID, addrArray);
- return ni;
+ jobject ifindex = createInteger(env, index);
+ CHECK_NULL_RETURN(ifindex, NULL);
+ return ifindex;
}
-#endif
return NULL;
}