Selector cleanup

Rémi Forax forax at univ-mlv.fr
Thu Jan 24 15:41:52 UTC 2008


Alan Bateman a écrit :
> Rémi Forax wrote:
>> Hi all, i currently develop a small web server and  I think codes 
>> related
>> to selectors can be improved just by changing some small pieces of code.
>> To be crystal clear, i don't want to re-implement all selector 
>> related stuffs but
>> just patch some parts of the actual code.
>>
>> There are some allocations in JDK API  that can be removed,
>> the code was badly retrofited to 1.5 and lot of field can be declared 
>> final.
>> Some methods/fields still 'use' raw types and doesn't take
>> advantage of autoboxing.
> You're right. Much of the code here dates back to 1.4 and we haven't 
> gone back to clean-up things like this.
>
>>
>> Futhermore, there is some divergence between Windows and *nix
>> code i don't understand.
>> By example, WindowsSelectorImpl and PollSelectorImpl uses a pipe to
>> implements wakeup but WindowsSelectorImpl  relies on Pipe
>> and PollSelectorImpl on IOUtil.initPipe().
>> I think this code should be the same.
> Ideally we would use a socketpair for the wakeup mechanism but Windows 
> doesn't support it. For this reason, Pipe is implemented as a loopback 
> connection and this works okay for the wakeup mechanism too. One thing 
> to mention is that PollSelectorImpl is only used now when running on 
> the Linux 2.4 kernel (it's not used with the 2.6 kernel and isn't used 
> on Solaris). I just mention this as someday it might become obsolete 
> and we can remove it.
ok.
>
>>
>> in WindowsSelectorImpl:
>>  - updateSelectedKeys() use an iterator to traverse the array
>>    (an ArrayList). It should use an indexed loop instead
>>    to avoid Iterator allocation.
>>  - field threads should be declared as an ArrayList
>>    because adjustThreadsCount() supose that i can be iterate
>>    using an indexed loop.
>>    Furthermore, it can be generified like this:
>>    private final ArrayList<Thread> threads = new ArrayList<Thread>();
> These clean-ups seem reasonable.
>
>> - class FDMap,
>>   I don't see why FdMap need to be a class, all methods can be moved
>>   as member methods of WindowsSelectorImpl without problems.
>>   Futhermore, the constructor of FdMap is private (get/put/remove too)
>>   so the compiler stupidly inserts accessor methods (access$000 etc.).
>>   Ok, the main point, here when the code was retrofited to 1.5,
>>   The new Integer() was not transformed to use Integer.valueOf()
>>   to share small integers and avoid allocation if file descriptor 
>> value are small.
> These are SOCKET types rather than file descriptors and unlikely to be 
> in the range that Integer caches (actually it should be a Long but 
> that is a story for another day).
ok, no valueOf(), i'm not an expert in Windows API.
But are you agree that class FdMap is not necessary.
>
>> - In class MapEntry, ski should be declared final.
>> - close(), set selectedKeys() to null doesn't allow the Set to be 
>> collected
>>    because publicSelectedKeys contains() a reference to it.
>>
>> in PollSelectorImpl:
>>  - interruptLock should be final.
>>  - close(), see WindowsSelectorImpl
>>
>> in EpollSelectorImpl:
>>  - like in poll, interruptLock should be final.
>>  - hashMap fdTokey should be generified and final.
>>  - close(), see WindowsSelectorImpl
>>  - implRegister/implDereg
>>    - They should use Integer.valueOf() instead of new Integer().
>>    - IOUtil.fdVal() is used spuriously, in implRegister but not
>>      in implDereg.
> These are integers so there could be some benefit (but probably very 
> hard to measure).
yes, very hard to mesure until you span 1k thread with one selector each.
btw if you take a look to EPollArrayWrapper, idlSet already use boxing.
>
>>
>>  - EPollArrayWrapper
>>    - updateList is a LinkedList, a double linked list that stores 
>> Updator object,
>>      I think it's more efficient to add a field next in the Updator 
>> object and
>>      link updator by hand in order to avoid to create LinkedList$Entry .
> Maybe but probably very hard to measure.
>
>>   - Updataor.opcode and Updator.fd should be declared final.
>>     - SelectorImpl:
>>     key and selectedKeys should be LinkedHashSet instead of Set
>>     because they are frequently iterated.
>>   let discuss about that before I submit patchs.
> The clean-ups you suggest seem reasonable so I would suggest going 
> ahead and sending a patch. 
i will do that.
> I'm happy to review and work with you to get the clean-ups integrated 
> (once OpenJDK/jdk7 re-opens for changes of course).
Do you have any idea when openjdk will be reopen ?
>
> -Alan.
>
> PS: I don't know anything about your "small web server" but the simple 
> server in com.sun.net.httpserver may be useful.
My small server is a research project that embeds a non-blocking parser 
in a webserver and
claims to have the same performance than grizzly. I will post a blog 
entry about it
when all benchmarks will be finished.

Rémi




More information about the core-libs-dev mailing list