8282726: java/net/vthread/BlockingSocketOps.java timeout/hang intermittently on Windows

Reviewed-by: djelinski
This commit is contained in:
Alan Bateman 2023-11-21 14:05:32 +00:00
parent 923207073a
commit 21a59b9f4e
8 changed files with 31 additions and 33 deletions

View File

@ -66,7 +66,7 @@ class PollsetPoller extends Poller {
} }
@Override @Override
void implDeregister(int fd) { void implDeregister(int fd, boolean polled) {
int ret = Pollset.pollsetCtl(setid, Pollset.PS_DELETE, fd, 0); int ret = Pollset.pollsetCtl(setid, Pollset.PS_DELETE, fd, 0);
assert ret == 0; assert ret == 0;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -62,8 +62,11 @@ class EPollPoller extends Poller {
} }
@Override @Override
void implDeregister(int fdVal) { void implDeregister(int fdVal, boolean polled) {
EPoll.ctl(epfd, EPOLL_CTL_DEL, fdVal, 0); // event is disabled if already polled
if (!polled) {
EPoll.ctl(epfd, EPOLL_CTL_DEL, fdVal, 0);
}
} }
@Override @Override

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -56,8 +56,11 @@ class KQueuePoller extends Poller {
} }
@Override @Override
void implDeregister(int fdVal) { void implDeregister(int fdVal, boolean polled) {
KQueue.register(kqfd, fdVal, filter, EV_DELETE); // event was deleted if already polled
if (!polled) {
KQueue.register(kqfd, fdVal, filter, EV_DELETE);
}
} }
@Override @Override

View File

@ -94,14 +94,16 @@ abstract class Poller {
} }
/** /**
* Register the file descriptor. * Register the file descriptor. The registration is "one shot", meaning it should
* be polled at most once.
*/ */
abstract void implRegister(int fdVal) throws IOException; abstract void implRegister(int fdVal) throws IOException;
/** /**
* Deregister the file descriptor. * Deregister the file descriptor.
* @param polled true if the file descriptor has already been polled
*/ */
abstract void implDeregister(int fdVal); abstract void implDeregister(int fdVal, boolean polled);
/** /**
* Poll for events. The {@link #polled(int)} method is invoked for each * Poll for events. The {@link #polled(int)} method is invoked for each
@ -182,23 +184,23 @@ abstract class Poller {
} }
/** /**
* Registers the file descriptor. * Registers the file descriptor to be polled at most once when the file descriptor
* is ready for I/O.
*/ */
private void register(int fdVal) throws IOException { private void register(int fdVal) throws IOException {
Thread previous = map.putIfAbsent(fdVal, Thread.currentThread()); Thread previous = map.put(fdVal, Thread.currentThread());
assert previous == null; assert previous == null;
implRegister(fdVal); implRegister(fdVal);
} }
/** /**
* Deregister the file descriptor, a no-op if already polled. * Deregister the file descriptor so that the file descriptor is not polled.
*/ */
private void deregister(int fdVal) { private void deregister(int fdVal) {
Thread previous = map.remove(fdVal); Thread previous = map.remove(fdVal);
assert previous == null || previous == Thread.currentThread(); boolean polled = (previous == null);
if (previous != null) { assert polled || previous == Thread.currentThread();
implDeregister(fdVal); implDeregister(fdVal, polled);
}
} }
/** /**

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -129,14 +129,7 @@ class PipeImpl
} }
// Establish connection (assume connection is eagerly accepted) // Establish connection (assume connection is eagerly accepted)
if (sa instanceof InetSocketAddress sc1 = SocketChannel.open(sa);
&& Thread.currentThread().isVirtual()) {
// workaround "lost event" issue on older releases of Windows
sc1 = SocketChannel.open();
sc1.socket().connect(sa, 10_000);
} else {
sc1 = SocketChannel.open(sa);
}
RANDOM_NUMBER_GENERATOR.nextBytes(secret.array()); RANDOM_NUMBER_GENERATOR.nextBytes(secret.array());
do { do {
sc1.write(secret); sc1.write(secret);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -46,16 +46,13 @@ class WEPollPoller extends Poller {
@Override @Override
void implRegister(int fdVal) throws IOException { void implRegister(int fdVal) throws IOException {
// re-arm int err = WEPoll.ctl(handle, EPOLL_CTL_ADD, fdVal, (event | EPOLLONESHOT));
int err = WEPoll.ctl(handle, EPOLL_CTL_MOD, fdVal, (event | EPOLLONESHOT));
if (err == ENOENT)
err = WEPoll.ctl(handle, EPOLL_CTL_ADD, fdVal, (event | EPOLLONESHOT));
if (err != 0) if (err != 0)
throw new IOException("epoll_ctl failed: " + err); throw new IOException("epoll_ctl failed: " + err);
} }
@Override @Override
void implDeregister(int fdVal) { void implDeregister(int fdVal, boolean polled) {
WEPoll.ctl(handle, EPOLL_CTL_DEL, fdVal, 0); WEPoll.ctl(handle, EPOLL_CTL_DEL, fdVal, 0);
} }

View File

@ -685,7 +685,7 @@ class BlockingSocketOps {
Socket s1 = new Socket(); Socket s1 = new Socket();
Socket s2; Socket s2;
try { try {
s1.connect(listener.getLocalSocketAddress(), 10_000); s1.connect(listener.getLocalSocketAddress());
s2 = listener.accept(); s2 = listener.accept();
} catch (IOException ioe) { } catch (IOException ioe) {
s1.close(); s1.close();

View File

@ -808,7 +808,7 @@ class BlockingChannelOps {
SocketChannel sc1 = SocketChannel.open(); SocketChannel sc1 = SocketChannel.open();
SocketChannel sc2 = null; SocketChannel sc2 = null;
try { try {
sc1.socket().connect(listener.getLocalAddress(), 10_000); sc1.socket().connect(listener.getLocalAddress());
sc2 = listener.accept(); sc2 = listener.accept();
} catch (IOException ioe) { } catch (IOException ioe) {
sc1.close(); sc1.close();