I synch'ed CVS with the latest version of the code last night. There's still a few bugfixes that I've since written, but not yet committed, but they too will be in CVS a little later tonight. Changelogs are here.
Through judicious use of the Observer pattern, I replaced the polling loop in the IOEventStream class with a loop that locks a ConditionVariable. The condition variable is signalled whenever one of the Subject objects calls update(), so now IO is only done when there are actual pending events. It had the side-effect of cleaning up the code, too, which is always a good sign. Load average in the IOEventStream test harness with no keyboard activity: 0.02.
I'm now working through some issues with the way login events are handled, and I realized that the reconnect() method is too tightly coupled to the SocketOutputFilter, so I'll see if I can come up with a more elegant implementation tonight.