I haven't slept all night but I got some preliminary thinking about how nio will affect everything. In a nutshell, there's no way to confine the changes to a single layer. Here's how I see it rolling out:

1. use a single selector for all network reads and have a single thread do a blocking select() on a single selector.
2. once we have channels available, start a thread for each channel, deliver the event to the appropriate state (states have to be registered as event listeners) and process the event in the same thread. do that in a big do{}while(no new events flag) loop to avoid unnecessary threads.
If a thread is already working on an event for the channel, just set its no_new_events_flag to false.
3. the main thread should wait for all workers to finish, but not more than some small timeout, perhaps 5-20 ms. Then repeat.


With this scheme we have only one thread blocked for network reads and only as many threads active as there are active channels during any given time-slice. Also, select() is supposed to be thread safe, however the resulting sets are not thread safe _and_ select() itself locks on the selector and on the sets (the docs don't say it, but I"m assuming its a nested lock) so the best bet is to have single thread do the demultiplexing.

Again, this is all a late-hours speculation, I'm going to purchase Java NIO (O'Reilly) from the local bookstore today and they may have better ideas. Or if anyone on the list knows nio very well and can convince me that this is all B.S., please write to me promptly (before I spend my money! ;))

_______________________________________________
devl mailing list
[EMAIL PROTECTED]
http://hawk.freenetproject.org:8080/cgi-bin/mailman/listinfo/devl

Reply via email to