X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Mon, 30 Aug 2010 13:23:13 +0200 From: Corinna Vinschen To: cygwin-xfree AT cygwin DOT com, cygwin AT cygwin DOT com Subject: Re: /dev/windows and select() [was Re: Slow response to keypresses in xorg-server-1.8.0-1] Message-ID: <20100830112313.GN6726@calimero.vinschen.de> Mail-Followup-To: cygwin-xfree AT cygwin DOT com, cygwin AT cygwin DOT com References: <4BDC3161 DOT 9070101 AT cornell DOT edu> <4BDDE5F1 DOT 9080204 AT cornell DOT edu> <4C2B8171 DOT 5020409 AT dronecode DOT org DOT uk> <4C5B08AE DOT 4080902 AT pobox DOT com> <4C5DD910 DOT 9050809 AT dronecode DOT org DOT uk> <4C7A62FD DOT 10506 AT dronecode DOT org DOT uk> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <4C7A62FD.10506@dronecode.org.uk> User-Agent: Mutt/1.5.20 (2009-06-14) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Aug 29 14:39, Jon TURNEY wrote: > On 08/08/2010 12:04, Andy Koppe wrote: > >On 7 August 2010 23:07, Jon TURNEY wrote: > >>Hmmm, looking again at the implementation of select(), I don't immediately > >>see that when waiting on /dev/windows, it checks that the message queue has > >>old messages on it before waiting. The MSDN documentation for > >>MsgWaitForMultipleObjects() seems to says that messages which had arrived > >>before the last PeekMessage() etc. aren't considered new and so don't end > >>the wait? > > > >I think you're right, a call to PeekMessage is needed for proper > >select() semantics: it shouldn't block if data is available for > >reading. > > Attached is a small test-case which seems to demonstrate this problem. > > Run ./dev-windows-select-test and observe select() blocks for the > full timeout, despite the fact that the /dev/windows fd is ready for > reading (and it reported as such as the end of the timeout) > > If you run './dev-windows-select-test -skip' to skip the > PeekMessage(), select() returns immediately, indicating the > /dev/windows fd is ready for reading. Again, thanks for the testcase. I applied a patch to Cygwin which should make select on /dev/windows fully functional. The blessed solution is to replace the call to MsgWaitForMultipleObjects with a call to MsgWaitForMultipleObjectsEx with the MWMO_INPUTAVAILABLE flag set. This flag is defined to do exactly what we need. The only downside is that this flag does not exist on NT4 and its usage results in an "invalid argument" error. So, for NT4, I added the workaround I described in my yesterday's soliloquy. I'm planning to release Cygwin 1.7.7 tomorrow at the latest, so please give it a test as soon as possible. Here's a binary DLL for testing (build w/o optimization, so it's probably a bit slow): http://cygwin.de/cygwin-177/new-cygwin1.dll.bz2 (md5sum: 7e07fd9eafd021697a0861c1ae4fa94e) Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple