From: Nathan L. <lut...@li...> - 2002-08-23 13:54:10
|
On Thu, Aug 22, 2002 at 02:31:22PM -0400, Chandan Kudige wrote: > This basically involves having a polling loop similar to the=20 > write_sigio_workaround(), but instead of poll() it will use the win32 > equivalent (WaitForMultipleObjects). This is a logical first step in=20 > converting over to pure Win32 eventually. > > This polling loop should trigger the uml interrupt handler. We dont want= =20 > to call the handler in the context of the polling thread since there is n= o=20 > SMP protection on this code and can cause race conditions. My hack for th= e=20 > console driver achieves it by triggering an event which causes the idle= =20 > loop to call sigio_handler() the next time it is scheduled. Actually, I took out the separate polling thread (that incremented sigio_hack_trigger) and it still works fine. The way it worked before=20 was: Polling thread: while(1) { if( data is available on a read fd ) ++sigio_hack_trigger; } Idle loop: while(1) { do scheduling stuff sleep a little if( sigio_hack_trigger > 0 ) { --sigio_hack_trigger; sigio_handler() } } I couldn't figure out how that is different from this: while(1) { do scheduling stuff sleep a little sigio_handler() } I changed the code to the loop above and removed the polling thread, and=20 everything seems to work correctly. The only difference is that=20 sigio_handler is called every time through the loop instead of only when=20 data is waiting, but since all it does is call poll() and exit when it=20 finds no data waiting, I don't see the difference. Of course, calling sigio_handler() from idle loop means that no interrupts= =20 are processed if a process is RUNNING... -Nathan --=20 Help reduce spam! PGP-sign your email. |