Using OptimizeIT (a superb product, too bad it costs at least $300), I finally 
found out why IndexClient is eating CPU cycles.

It's the Ticker class. A Ticker is created with a tickerTime of 0 ms - thus the 
ticker never sleeps and constantly polls its event queue.

The Ticker is created by Core() that passes the value of the static variable 
Core.tickerTime to the Ticker constructor - and Core.tickerTime is 0.

What happens is this:

-in the beginning, Core.tickerTime is 0 (VM default value)
-IndexClient(Params, Logger) creates a SimplifiedClient
--SimplifiedClient(Params, Logger) (indirectly) calls CLI(Params, Logger, 
boolean)
---CLI(Params, Logger, boolean) calls ClientUtil.getServiceCore(int)
----ClientUtil.getServiceCore(int) creates a ClientCore
-----ClientCore(ListeningAddress, Presentation) calls the Core constructor
------Core(ListeningAddress, Presentation, HandshakeHandler) creates a Timer 
with a tickerTime value of 0 => BANG!
--now SimplifiedClient(Params, Logger) calls Core.init(Params) which sets 
Core.tickerTime to a reasonable value -- but it's already TOO LATE!

A workaround is to call Core.init(someParams) before creating the first 
IndexClient. I leave devising a real bug fix to Brandon... ;-)

Also, I have no idea why this doesn't happen on non-Windows platforms. Maybe a 
sleep(0) does sleep for a few ms on Unix...?

BTW: I leeched Freenet from CVS 4 weeks ago or so - I hope this trackdown isn't 
obsolete by now...

-Stefan

-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20010602/2fee4484/attachment.html>

Reply via email to