Motivation: OIO/NIO use a volatile variable to track if a read is pending. EPOLL does not use a volatile an executes a Runnable on the event loop thread to set readPending to false. These mechansims should be consistent, and not using a volatile variable is preferable because the variable is written to frequently in the event loop thread. OIO also does not set readPending to false before each fireChannelRead operation and may result in reading more data than the user desires. Modifications: - OIO/NIO should not use a volatile variable for readPending - OIO should set readPending to false before each fireChannelRead Result: OIO/NIO/EPOLL are more consistent w.r.t. readPending and volatile variable operations are reduced Fixes https://github.com/netty/netty/issues/5069
40 lines
1.6 KiB
Java
40 lines
1.6 KiB
Java
/*
|
|
* Copyright 2016 The Netty Project
|
|
*
|
|
* The Netty Project licenses this file to you under the Apache License,
|
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
package io.netty.channel.epoll;
|
|
|
|
import io.netty.bootstrap.Bootstrap;
|
|
import io.netty.bootstrap.ServerBootstrap;
|
|
import io.netty.buffer.ByteBufAllocator;
|
|
import io.netty.testsuite.transport.TestsuitePermutation;
|
|
import io.netty.testsuite.transport.socket.SocketAutoReadTest;
|
|
|
|
import java.util.List;
|
|
|
|
public class EpollETSocketAutoReadTest extends SocketAutoReadTest {
|
|
@Override
|
|
protected List<TestsuitePermutation.BootstrapComboFactory<ServerBootstrap, Bootstrap>> newFactories() {
|
|
return EpollSocketTestPermutation.INSTANCE.socket();
|
|
}
|
|
|
|
@Override
|
|
protected void configure(ServerBootstrap bootstrap, Bootstrap bootstrap2, ByteBufAllocator allocator) {
|
|
super.configure(bootstrap, bootstrap2, allocator);
|
|
bootstrap.option(EpollChannelOption.EPOLL_MODE, EpollMode.EDGE_TRIGGERED)
|
|
.childOption(EpollChannelOption.EPOLL_MODE, EpollMode.EDGE_TRIGGERED);
|
|
bootstrap2.option(EpollChannelOption.EPOLL_MODE, EpollMode.EDGE_TRIGGERED);
|
|
}
|
|
}
|