return false;
}
key.interestOps(key.interestOps() & (~SelectionKey.OP_WRITE));
DatagramChannel ch = session.getChannel();
Queue writeRequestQueue = session.getWriteRequestQueue();
int writtenBytes = 0;
int maxWrittenBytes = ((DatagramSessionConfig) session.getConfig()).getSendBufferSize() << 1;
try {
for (;;) {
WriteRequest req;
synchronized (writeRequestQueue) {
req = (WriteRequest) writeRequestQueue.first();
}
if (req == null)
break;
ByteBuffer buf = (ByteBuffer) req.getMessage();
if (buf.remaining() == 0) {
// pop and fire event
synchronized (writeRequestQueue) {
writeRequestQueue.pop();
}
buf.reset();
if (!buf.hasRemaining()) {
session.increaseWrittenMessages();
}
((DatagramFilterChain) session.getFilterChain())
.fireMessageSent(session, req);
continue;
}
SocketAddress destination = req.getDestination();
if (destination == null) {
destination = session.getRemoteAddress();
}
int localWrittenBytes = ch.send(buf.buf(), destination);
writtenBytes += localWrittenBytes;
if (localWrittenBytes == 0 || writtenBytes >= maxWrittenBytes) {
// Kernel buffer is full or wrote too much
key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
return false;
} else {
// pop and fire event
synchronized (writeRequestQueue) {
writeRequestQueue.pop();
}
buf.reset();
if (!buf.hasRemaining()) {