jsd@esl.ESL.COM (Jeff Dalton) (03/14/91)
Short version of question: Where are x events queued when using Xm and Xt? Some events come off the socket, others never make it to the socket but are queued. Where? Longer version of question: I'm writing an x event loop in Ada which is interrupt driven so it doesn't need to poll. The general architecture is as follows: -- x event loop begin set_up_socket_for_async_notification; -- via SIGIO loop if not event_pending then suspend_until_data_on_socket; -- does not block process or poll, but does block -- ada task so other ada tasks can run. end if; get_next_event; process_event; end loop; end; So when a SIGIO is generated the ISR routine does a unix select(2) and resumes the ada task which has data pending on a socket. In this case, the x_event_loop. This works fine as long as ALL events generate a SIGIO and are placed on the socket. What seems to be happening is that some events generated/handled at the Xm or Xt layer are not raising the SIGIO. So, for example, if I create a window with a pushbutton (using Xm and Xt), all the events for creating the window raise the SIGIO, but the x_event_loop will suspend (since no SIGIO was generated) before displaying the pushbutton. If I send a SIGIO to the process (kill(1)), it shows me there is no data on the socket. So the events to display the button are somewhere and once I do a get_next_event I'll find them, but they aren't on the socket. Once I generate an event which goes onto the socket (eg. mouse-drag event, etc.) the button will be displayed. -Jeff btw: According to HP Support, this is "out of scope" for them. -- Jeff Dalton, ESL Inc. Real programmers can write jsd@esl.com Fortran in any language.
chan@hpfcmgw.HP.COM (Chan Benson) (03/19/91)
> Where are x events queued when using Xm and Xt? Some events > come off the socket, others never make it to the socket but > are queued. Where? Xlib has an internal event buffer. All events come through the socket, but a whole chunk of them may get read at once (even though you've only asked for one). You need to modify your code so that you don't block until XPending() returns 0, which means that everything has been read off the internal queue and there's nothing waiting to be read from the socket. Hope that helps. If you need more details, let me know. -- Chan Benson HP Fort Collins
stroyan@hpfcso.FC.HP.COM (Mike Stroyan) (03/19/91)
> -- x event loop > begin > set_up_socket_for_async_notification; -- via SIGIO > loop > if not event_pending > then > suspend_until_data_on_socket; > -- does not block process or poll, but does block > -- ada task so other ada tasks can run. > end if; > get_next_event; > process_event; > end loop; > end; You need to change- get_next_event; process_event; to while (XPending(display)) { get_next_event; process_event; } The Xlib library will read large amounts from the socket at one time. This improves performance by reducing the number of read calls. It also means that multiple events may be read in response to one SIGIO. You may also run into cases where something comes in on the socket that is not an event. The XPending test will avoid blocking in "get_next_event" in that circumstance. Mike Stroyan, mike_stroyan@fc.hp.com