8034801: AIX: (ch) Fix synchronization issue in AixPollPort.java
Reviewed-by: alanb
This commit is contained in:
parent
39d3c424cb
commit
063b3a7453
@ -107,6 +107,7 @@ final class AixPollPort
|
|||||||
private final ArrayBlockingQueue<Event> queue;
|
private final ArrayBlockingQueue<Event> queue;
|
||||||
private final Event NEED_TO_POLL = new Event(null, 0);
|
private final Event NEED_TO_POLL = new Event(null, 0);
|
||||||
private final Event EXECUTE_TASK_OR_SHUTDOWN = new Event(null, 0);
|
private final Event EXECUTE_TASK_OR_SHUTDOWN = new Event(null, 0);
|
||||||
|
private final Event CONTINUE_AFTER_CTL_EVENT = new Event(null, 0);
|
||||||
|
|
||||||
// encapsulates a pollset control event for a file descriptor
|
// encapsulates a pollset control event for a file descriptor
|
||||||
static class ControlEvent {
|
static class ControlEvent {
|
||||||
@ -342,7 +343,11 @@ final class AixPollPort
|
|||||||
|
|
||||||
// To emulate one shot semantic we need to remove
|
// To emulate one shot semantic we need to remove
|
||||||
// the file descriptor here.
|
// the file descriptor here.
|
||||||
pollsetCtl(pollset, PS_DELETE, fd, 0);
|
if (fd != sp[0] && fd != ctlSp[0]) {
|
||||||
|
synchronized (controlQueue) {
|
||||||
|
pollsetCtl(pollset, PS_DELETE, fd, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// wakeup
|
// wakeup
|
||||||
if (fd == sp[0]) {
|
if (fd == sp[0]) {
|
||||||
@ -351,10 +356,6 @@ final class AixPollPort
|
|||||||
drain1(sp[0]);
|
drain1(sp[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the only file descriptor without
|
|
||||||
// one shot semantic => register it again.
|
|
||||||
pollsetCtl(pollset, PS_ADD, sp[0], Net.POLLIN);
|
|
||||||
|
|
||||||
// queue special event if there are more events
|
// queue special event if there are more events
|
||||||
// to handle.
|
// to handle.
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
@ -368,12 +369,12 @@ final class AixPollPort
|
|||||||
if (fd == ctlSp[0]) {
|
if (fd == ctlSp[0]) {
|
||||||
synchronized (controlQueue) {
|
synchronized (controlQueue) {
|
||||||
drain1(ctlSp[0]);
|
drain1(ctlSp[0]);
|
||||||
// This file descriptor does not have
|
|
||||||
// one shot semantic => register it again.
|
|
||||||
pollsetCtl(pollset, PS_ADD, ctlSp[0], Net.POLLIN);
|
|
||||||
processControlQueue();
|
processControlQueue();
|
||||||
}
|
}
|
||||||
continue;
|
if (n > 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return CONTINUE_AFTER_CTL_EVENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
PollableChannel channel = fdToChannel.get(fd);
|
PollableChannel channel = fdToChannel.get(fd);
|
||||||
@ -431,6 +432,11 @@ final class AixPollPort
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// contine after we processed a control event
|
||||||
|
if (ev == CONTINUE_AFTER_CTL_EVENT) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// handle wakeup to execute task or shutdown
|
// handle wakeup to execute task or shutdown
|
||||||
if (ev == EXECUTE_TASK_OR_SHUTDOWN) {
|
if (ev == EXECUTE_TASK_OR_SHUTDOWN) {
|
||||||
Runnable task = pollTask();
|
Runnable task = pollTask();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user