Filip Hanik - Dev Lists wrote:
Remy Maucherat wrote:
Filip Hanik - Dev Lists wrote:
So it uses a poller automatically, and the WRITE event would be sent when the socket is signaled by the poller, then. This is very similar. The only problem is that it could cause sync issues, since the servlet doesn't know for sure when the write poller is used.
this is much lower than the servlet and comet events. when doing socketchannel.write, no poller, or selectors are involved. If there simply isn't space on the buffer, it returns 0. At this point, the InternalNioOutputBuffer would register the socket, and the servlet thread would return. When the poller detects "write available on socket", it wakes up, internally it would try to write the remaining data from bbuf. when all data from bbuf is written, the worker thread then proceeds to signal the servlet with a NOTIFY/WRITE_COMPLETE

so all the actual non blocking writing is hidden from the user/servlet. and no sync issues should arise since we will follow your suggestion and throw an exception.

Yes, I perfectly understand that, and it mostly works. However, there's maybe a time gap for trouble:
- the write returns 0
- the "available" flag for write goes to false
- the socket is put in the write poller
- the stack that lead to the write resolves, and the code returns to the servlet; the servlet is supposed to look at the "available" flag, see that it false, and stop writing - meanwhile, the socket lands in the poller (quickly or not), and could exit the poller quickly too, which triggers the flush of the leftover bytes and the WRITE_COMPLETE event

So there could be a race between the servlet checking the "available" flag and the flush, so the flush could be done at the same time as another write by the servlet. This is very unlikely (and maybe it cannot happen), but this is why I preferred using a method that the servlet would be calling after checking the "available" flag.

There is a timeout for write in blocking mode, but not in non blocking mode. The timeout is tracked by the poller structure, but mostly concerns read events, so it is possible for a socket to timeout when there are no read events, even if there is write activity on the socket.
yes, with NIO we update this poller structure even during async writes, so if there is write activity on the socket, the socket wont timeout.

Ok, I had understood correctly then. I will not be doing that in APR. This would cost many syncs and other operations, which is not acceptable just for supporting this "feature".

Rémy

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to