function. Because synergy doesn't use posix cancellation, it
cannot wake up a thread waiting on a condition variable. So
the wrapper would wake up periodically to test if the thread was
cancelled (according to synergy's cancellation state) then go
back to waiting. Well the condition could be signalled while
we're testing and be lost and we'd never return from the wait.
So now we wake up after a maximum timeout and return to the
caller. The caller must check for this spurious wakeup but all
callers should do this anyway so we're okay there.
poll() but there was a race condition where the thread trying
to unblock poll() could send the signal before the polling
thread had entered poll(). Now using a pipe and polling on
that and the client's sockets, and just writing a byte into
the pipe to unblock poll. This persists until the next call
to poll() so we might force poll() to return once unnecessarily
but that's not a problem. This change makes the BSD code
similar to the winsock code, which uses a winsock event instead
of a pipe.
event loop model. Streams, stream filters, and sockets are
converted. Client proxies are almost converted. CServer is
in progress. Removed all HTTP code. Haven't converted the
necessary win32 arch stuff.
an event queue and events, TCP sockets converted to use events,
unix multithreading and network stuff converted, and an X Windows
event queue subclass.
lib/arch. This should make porting easier. Will probably
continue to refactor a little more, moving platform dependent
event handling stuff into lib/platform.