PARCEL@INTELLICORP.COM (Scott Parcel) (02/27/90)
I have some questions and comments about the recent discussion of
handling events inside of Unix signal handlers. My particular
interest is in using signals to do all X event processing.
First, some of the comments imply a problem with interrupts occuring
at all, causing returns from reads etc., some seem to be concerned
with the problems of reentrant execution of Xlib calls. It was also
suggested that various toolkits can be used to avoid some of these
problems -- which confuses me since the toolkits all make Xlib calls
(I'm missing something - but I'm a novice at X).
The following is my understanding of signal handling problems and
methodology:
1. Reentrant execution of any Xlib routines which manipulate the
event queue can cause protocol errors. If events are handled
only inside of a signal handler, hence no reentrant calls to
Xlib, there should be no Xlib problem.
2. Reentrant execution of some Unix system calls can be a
problem, independant of the use of X. Globals like errno are
easily messed up. I don't yet know exactly which system calls
to be concerned about, or the best way to protect onesself.
3. Interupts can cause system calls to return with an error,
independant of the use of X. Your code needs to expect this.
I don't know how X copes with this. We do most of our X code
inside of interupts, we do not alloww signals to interupt Xlib
code.
4. If signals are the primary means of processing events, some
mechanism must be used to watch for the X timers - a little
invasive since the timer queue is not a "public" part of X.
5. Xt can handle reentrant execution of XtDispatchEvent(), but as
before, if a callback fired by XtDispatchEvent() happens to be
doing any Xlib calls reentrant execution of Xlib must be
avoided. (For some reason unknown to me, timer callbacks in
Xt are not managed in the same reentrant fashion as
XtDispatchEvent, consequently destroys occuring inside of a
timer callback inside of XtAppProcessEvent() inside of
XtDispatchEvent() are put on the earlier XtDispatchEvent
destroy queue.)
Questions:
0. Am I correct in assuming the problems with reentrant execution
of Xlib calls have to do with operations which read or write
to the event queues ?
1. Are there reentrancy problems in Xt itself ?
2. Is there a good workaround to detect interuption of
nonreentrant system calls or deal with reentrant execution of
system calls ?
3. How does XView 'notify_do_dispatch' handle this stuff ?
4. Why are timer callbacks in Xt not handled in a manner similar
to XtDispatchEvent ?
5. How do the toolkits handle signals more gracefully than Xlib
alone ?
-- scott parcel parcel@intellicorp.com
-------