# HG changeset patch # User chegar # Date 1366115419 -3600 # Node ID 63829f318ebfd7f3548691cb945988e8a8be631f # Parent 986f53b29dcc8f8ddc1453c0a1c71702c3b80dd8# Parent e659009ee08d73bd9ed01963c10cfbb1ddb2779b Merge diff -r 986f53b29dcc -r 63829f318ebf jdk/src/share/classes/java/util/Objects.java diff -r 986f53b29dcc -r 63829f318ebf jdk/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h --- a/jdk/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h Tue Apr 16 13:30:19 2013 +0100 @@ -143,9 +143,9 @@ * structure from the information present in a given Java Composite * object. */ -typedef JNIEXPORT void (JNICALL CompInfoFunc)(JNIEnv *env, - CompositeInfo *pCompInfo, - jobject Composite); +typedef void (JNICALL CompInfoFunc)(JNIEnv *env, + CompositeInfo *pCompInfo, + jobject Composite); /* * The additional information needed to implement a primitive that diff -r 986f53b29dcc -r 63829f318ebf jdk/src/share/npt/npt.h --- a/jdk/src/share/npt/npt.h Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/src/share/npt/npt.h Tue Apr 16 13:30:19 2013 +0100 @@ -94,13 +94,13 @@ JNIEXPORT void JNICALL nptInitialize (NptEnv **pnpt, char *nptVersion, char *options); -typedef JNIEXPORT void (JNICALL *NptInitialize) - (NptEnv **pnpt, char *nptVersion, char *options); +typedef void (JNICALL *NptInitialize) + (NptEnv **pnpt, char *nptVersion, char *options); JNIEXPORT void JNICALL nptTerminate (NptEnv* npt, char *options); -typedef JNIEXPORT void (JNICALL *NptTerminate) - (NptEnv* npt, char *options); +typedef void (JNICALL *NptTerminate) + (NptEnv* npt, char *options); #ifdef __cplusplus } /* extern "C" */ diff -r 986f53b29dcc -r 63829f318ebf jdk/src/solaris/javavm/export/jni_md.h --- a/jdk/src/solaris/javavm/export/jni_md.h Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/src/solaris/javavm/export/jni_md.h Tue Apr 16 13:30:19 2013 +0100 @@ -26,8 +26,17 @@ #ifndef _JAVASOFT_JNI_MD_H_ #define _JAVASOFT_JNI_MD_H_ -#define JNIEXPORT -#define JNIIMPORT +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#if (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ > 2))) || __has_attribute(visibility) + #define JNIEXPORT __attribute__((visibility("default"))) + #define JNIIMPORT __attribute__((visibility("default"))) +#else + #define JNIEXPORT + #define JNIIMPORT +#endif + #define JNICALL typedef int jint; diff -r 986f53b29dcc -r 63829f318ebf jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c --- a/jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Tue Apr 16 13:30:19 2013 +0100 @@ -43,7 +43,7 @@ static void *awtHandle = NULL; -typedef JNIEXPORT jint JNICALL JNI_OnLoad_type(JavaVM *vm, void *reserved); +typedef jint JNICALL JNI_OnLoad_type(JavaVM *vm, void *reserved); /* Initialize the Java VM instance variable when the library is first loaded */ @@ -206,7 +206,7 @@ jobject frame, jstring jcommand) { /* type of the old backdoor function */ - typedef JNIEXPORT void JNICALL + typedef void JNICALL XsessionWMcommand_type(JNIEnv *env, jobject this, jobject frame, jstring jcommand); @@ -234,7 +234,7 @@ JNIEXPORT void JNICALL Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jargv) { - typedef JNIEXPORT void JNICALL + typedef void JNICALL XsessionWMcommand_New_type(JNIEnv *env, jobjectArray jargv); static XsessionWMcommand_New_type *XsessionWMcommand = NULL; diff -r 986f53b29dcc -r 63829f318ebf jdk/src/windows/classes/java/net/DualStackPlainSocketImpl.java --- a/jdk/src/windows/classes/java/net/DualStackPlainSocketImpl.java Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/src/windows/classes/java/net/DualStackPlainSocketImpl.java Tue Apr 16 13:30:19 2013 +0100 @@ -152,8 +152,9 @@ if (!fd.valid()) return; - close0(fdAccess.get(fd)); + final int nativefd = fdAccess.get(fd); fdAccess.set(fd, -1); + close0(nativefd); } void socketShutdown(int howto) throws IOException { diff -r 986f53b29dcc -r 63829f318ebf jdk/src/windows/native/java/net/SocketInputStream.c --- a/jdk/src/windows/native/java/net/SocketInputStream.c Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/src/windows/native/java/net/SocketInputStream.c Tue Apr 16 13:30:19 2013 +0100 @@ -134,32 +134,35 @@ (*env)->SetByteArrayRegion(env, data, off, nread, (jbyte *)bufP); } else { if (nread < 0) { - /* - * Recv failed. - */ - switch (WSAGetLastError()) { - case WSAEINTR: - JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", - "socket closed"); - break; + // Check if the socket has been closed since we last checked. + // This could be a reason for recv failing. + if ((*env)->GetIntField(env, fdObj, IO_fd_fdID) == -1) { + NET_ThrowSocketException(env, "Socket closed"); + } else { + switch (WSAGetLastError()) { + case WSAEINTR: + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", + "socket closed"); + break; - case WSAECONNRESET: - case WSAESHUTDOWN: - /* - * Connection has been reset - Windows sometimes reports - * the reset as a shutdown error. - */ - JNU_ThrowByName(env, "sun/net/ConnectionResetException", - ""); - break; + case WSAECONNRESET: + case WSAESHUTDOWN: + /* + * Connection has been reset - Windows sometimes reports + * the reset as a shutdown error. + */ + JNU_ThrowByName(env, "sun/net/ConnectionResetException", + ""); + break; - case WSAETIMEDOUT : - JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException", - "Read timed out"); - break; + case WSAETIMEDOUT : + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException", + "Read timed out"); + break; - default: - NET_ThrowCurrent(env, "recv failed"); + default: + NET_ThrowCurrent(env, "recv failed"); + } } } } diff -r 986f53b29dcc -r 63829f318ebf jdk/test/java/net/Socket/asyncClose/Race.java --- a/jdk/test/java/net/Socket/asyncClose/Race.java Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/test/java/net/Socket/asyncClose/Race.java Tue Apr 16 13:30:19 2013 +0100 @@ -23,8 +23,8 @@ /* * @test - * @bug 8006395 - * @summary Race in async socket close on Linux + * @bug 8006395 8012244 + * @summary Tests racing code that reads and closes a Socket */ import java.io.InputStream; @@ -58,7 +58,7 @@ Thread.sleep(50); } catch (Exception x) { if (!(x instanceof SocketException - && x.getMessage().equals("Socket closed"))) + && x.getMessage().equalsIgnoreCase("socket closed"))) x.printStackTrace(); // ok, expect Socket closed } diff -r 986f53b29dcc -r 63829f318ebf jdk/test/java/util/Objects/BasicObjectsTest.java diff -r 986f53b29dcc -r 63829f318ebf jdk/test/java/util/concurrent/CompletableFuture/Basic.java --- a/jdk/test/java/util/concurrent/CompletableFuture/Basic.java Sat Apr 13 21:51:36 2013 +0100 +++ b/jdk/test/java/util/concurrent/CompletableFuture/Basic.java Tue Apr 16 13:30:19 2013 +0100 @@ -486,40 +486,61 @@ CompletableFuture cf1 = supplyAsync(() -> 1); CompletableFuture cf2 = supplyAsync(() -> 2); cf3 = cf1.applyToEither(cf2, (x) -> { check(x == 1 || x == 2); return x; }); + checkCompletedNormally(cf3, new Object[] {1, 2}); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, new Object[] {1, 2}); cf1 = supplyAsync(() -> 1); cf2 = supplyAsync(() -> 2); cf3 = cf1.applyToEitherAsync(cf2, (x) -> { check(x == 1 || x == 2); return x; }); + checkCompletedNormally(cf3, new Object[] {1, 2}); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, new Object[] {1, 2}); cf1 = supplyAsync(() -> 1); cf2 = supplyAsync(() -> 2); cf3 = cf1.applyToEitherAsync(cf2, (x) -> { check(x == 1 || x == 2); return x; }, executor); + checkCompletedNormally(cf3, new Object[] {1, 2}); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, new Object[] {1, 2}); cf1 = supplyAsync(() -> { throw new RuntimeException(); }); cf2 = supplyAsync(() -> 2); cf3 = cf1.applyToEither(cf2, (x) -> { check(x == 2); return x; }); + try { check(cf3.join() == 2); } catch (CompletionException x) { pass(); } + check(cf3.isDone()); check(cf1.isDone() || cf2.isDone()); - try { check(cf3.join() == 1); } catch (CompletionException x) { pass(); } - check(cf3.isDone()); cf1 = supplyAsync(() -> 1); cf2 = supplyAsync(() -> { throw new RuntimeException(); }); cf3 = cf1.applyToEitherAsync(cf2, (x) -> { check(x == 1); return x; }); - check(cf1.isDone() || cf2.isDone()); try { check(cf3.join() == 1); } catch (CompletionException x) { pass(); } check(cf3.isDone()); + check(cf1.isDone() || cf2.isDone()); cf1 = supplyAsync(() -> { throw new RuntimeException(); }); cf2 = supplyAsync(() -> { throw new RuntimeException(); }); cf3 = cf1.applyToEitherAsync(cf2, (x) -> { fail(); return x; }); + checkCompletedExceptionally(cf3); check(cf1.isDone() || cf2.isDone()); - checkCompletedExceptionally(cf3); + + final Phaser cf3Done = new Phaser(2); + cf1 = supplyAsync(() -> { cf3Done.arriveAndAwaitAdvance(); return 1; }); + cf2 = supplyAsync(() -> 2); + cf3 = cf1.applyToEither(cf2, (x) -> { check(x == 2); return x; }); + checkCompletedNormally(cf3, 2); + checkCompletedNormally(cf2, 2); + check(!cf1.isDone()); + cf3Done.arrive(); + checkCompletedNormally(cf1, 1); + checkCompletedNormally(cf3, 2); + + cf1 = supplyAsync(() -> 1); + cf2 = supplyAsync(() -> { cf3Done.arriveAndAwaitAdvance(); return 2; }); + cf3 = cf1.applyToEitherAsync(cf2, (x) -> { check(x == 1); return x; }); + checkCompletedNormally(cf3, 1); + checkCompletedNormally(cf1, 1); + check(!cf2.isDone()); + cf3Done.arrive(); + checkCompletedNormally(cf2, 2); + checkCompletedNormally(cf3, 1); } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -531,45 +552,66 @@ CompletableFuture cf1 = supplyAsync(() -> 1); CompletableFuture cf2 = supplyAsync(() -> 2); cf3 = cf1.acceptEither(cf2, (x) -> { check(x == 1 || x == 2); atomicInt.incrementAndGet(); }); + checkCompletedNormally(cf3, null); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, null); check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = supplyAsync(() -> 1); cf2 = supplyAsync(() -> 2); cf3 = cf1.acceptEitherAsync(cf2, (x) -> { check(x == 1 || x == 2); atomicInt.incrementAndGet(); }); + checkCompletedNormally(cf3, null); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, null); check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = supplyAsync(() -> 1); cf2 = supplyAsync(() -> 2); cf3 = cf2.acceptEitherAsync(cf1, (x) -> { check(x == 1 || x == 2); atomicInt.incrementAndGet(); }, executor); + checkCompletedNormally(cf3, null); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, null); check(atomicInt.get() == (before + 1)); cf1 = supplyAsync(() -> { throw new RuntimeException(); }); cf2 = supplyAsync(() -> 2); cf3 = cf2.acceptEitherAsync(cf1, (x) -> { check(x == 2); }, executor); - check(cf1.isDone() || cf2.isDone()); try { check(cf3.join() == null); } catch (CompletionException x) { pass(); } check(cf3.isDone()); + check(cf1.isDone() || cf2.isDone()); cf1 = supplyAsync(() -> 1); cf2 = supplyAsync(() -> { throw new RuntimeException(); }); cf3 = cf2.acceptEitherAsync(cf1, (x) -> { check(x == 1); }); - check(cf1.isDone() || cf2.isDone()); try { check(cf3.join() == null); } catch (CompletionException x) { pass(); } check(cf3.isDone()); + check(cf1.isDone() || cf2.isDone()); cf1 = supplyAsync(() -> { throw new RuntimeException(); }); cf2 = supplyAsync(() -> { throw new RuntimeException(); }); cf3 = cf2.acceptEitherAsync(cf1, (x) -> { fail(); }); + checkCompletedExceptionally(cf3); check(cf1.isDone() || cf2.isDone()); - checkCompletedExceptionally(cf3); + + final Phaser cf3Done = new Phaser(2); + cf1 = supplyAsync(() -> { cf3Done.arriveAndAwaitAdvance(); return 1; }); + cf2 = supplyAsync(() -> 2); + cf3 = cf1.acceptEither(cf2, (x) -> { check(x == 2); }); + checkCompletedNormally(cf3, null); + checkCompletedNormally(cf2, 2); + check(!cf1.isDone()); + cf3Done.arrive(); + checkCompletedNormally(cf1, 1); + checkCompletedNormally(cf3, null); + + cf1 = supplyAsync(() -> 1); + cf2 = supplyAsync(() -> { cf3Done.arriveAndAwaitAdvance(); return 2; }); + cf3 = cf1.acceptEitherAsync(cf2, (x) -> { check(x == 1); }); + checkCompletedNormally(cf3, null); + checkCompletedNormally(cf1, 1); + check(!cf2.isDone()); + cf3Done.arrive(); + checkCompletedNormally(cf2, 2); + checkCompletedNormally(cf3, null); } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -581,51 +623,80 @@ CompletableFuture cf1 = runAsync(() -> { }); CompletableFuture cf2 = runAsync(() -> { }); cf3 = cf1.runAfterEither(cf2, () -> { atomicInt.incrementAndGet(); }); + checkCompletedNormally(cf3, null); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, null); check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = runAsync(() -> { }); cf2 = runAsync(() -> { }); cf3 = cf1.runAfterEitherAsync(cf2, () -> { atomicInt.incrementAndGet(); }); + checkCompletedNormally(cf3, null); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, null); check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = runAsync(() -> { }); cf2 = runAsync(() -> { }); cf3 = cf2.runAfterEitherAsync(cf1, () -> { atomicInt.incrementAndGet(); }, executor); + checkCompletedNormally(cf3, null); check(cf1.isDone() || cf2.isDone()); - checkCompletedNormally(cf3, null); check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = runAsync(() -> { throw new RuntimeException(); }); cf2 = runAsync(() -> { }); cf3 = cf2.runAfterEither(cf1, () -> { atomicInt.incrementAndGet(); }); + try { + check(cf3.join() == null); + check(atomicInt.get() == (before + 1)); + } catch (CompletionException x) { pass(); } + check(cf3.isDone()); check(cf1.isDone() || cf2.isDone()); - try { check(cf3.join() == null); } catch (CompletionException x) { pass(); } - check(cf3.isDone()); - check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = runAsync(() -> { }); cf2 = runAsync(() -> { throw new RuntimeException(); }); cf3 = cf1.runAfterEitherAsync(cf2, () -> { atomicInt.incrementAndGet(); }); + try { + check(cf3.join() == null); + check(atomicInt.get() == (before + 1)); + } catch (CompletionException x) { pass(); } + check(cf3.isDone()); check(cf1.isDone() || cf2.isDone()); - try { check(cf3.join() == null); } catch (CompletionException x) { pass(); } - check(cf3.isDone()); - check(atomicInt.get() == (before + 1)); before = atomicInt.get(); cf1 = runAsync(() -> { throw new RuntimeException(); }); cf2 = runAsync(() -> { throw new RuntimeException(); }); cf3 = cf2.runAfterEitherAsync(cf1, () -> { atomicInt.incrementAndGet(); }, executor); + checkCompletedExceptionally(cf3); check(cf1.isDone() || cf2.isDone()); - checkCompletedExceptionally(cf3); check(atomicInt.get() == before); + + final Phaser cf3Done = new Phaser(2); + before = atomicInt.get(); + cf1 = runAsync(() -> { cf3Done.arriveAndAwaitAdvance(); }); + cf2 = runAsync(() -> { }); + cf3 = cf1.runAfterEither(cf2, () -> { atomicInt.incrementAndGet(); }); + checkCompletedNormally(cf3, null); + checkCompletedNormally(cf2, null); + check(!cf1.isDone()); + check(atomicInt.get() == (before + 1)); + cf3Done.arrive(); + checkCompletedNormally(cf1, null); + checkCompletedNormally(cf3, null); + + before = atomicInt.get(); + cf1 = runAsync(() -> { }); + cf2 = runAsync(() -> { cf3Done.arriveAndAwaitAdvance(); }); + cf3 = cf1.runAfterEitherAsync(cf2, () -> { atomicInt.incrementAndGet(); }); + checkCompletedNormally(cf3, null); + checkCompletedNormally(cf1, null); + check(!cf2.isDone()); + check(atomicInt.get() == (before + 1)); + cf3Done.arrive(); + checkCompletedNormally(cf2, null); + checkCompletedNormally(cf3, null); } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- @@ -670,16 +741,16 @@ //---------------------------------------------------------------- // anyOf tests //---------------------------------------------------------------- - //try { - // CompletableFuture cf3; - // for (int k=0; k < 10; k++){ - // CompletableFuture cf1 = supplyAsync(() -> 1); - // CompletableFuture cf2 = supplyAsync(() -> 2); - // cf3 = CompletableFuture.anyOf(cf1, cf2); - // check(cf1.isDone() || cf2.isDone()); - // checkCompletedNormally(cf3, new Object[] {1, 2}); - // } - //} catch (Throwable t) { unexpected(t); } + try { + CompletableFuture cf3; + for (int k=0; k < 10; k++){ + CompletableFuture cf1 = supplyAsync(() -> 1); + CompletableFuture cf2 = supplyAsync(() -> 2); + cf3 = CompletableFuture.anyOf(cf1, cf2); + checkCompletedNormally(cf3, new Object[] {1, 2}); + check(cf1.isDone() || cf2.isDone()); + } + } catch (Throwable t) { unexpected(t); } //---------------------------------------------------------------- // allOf tests