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.