generic async event handlers in the event loop, for remote non-stop (was: generic `struct serial' interface pipe for remote non-stop)

Pedro Alves pedro@codesourcery.com
Fri Oct 24 00:33:00 GMT 2008


Hi guys,

I'm going to apply the attached patch, which is a cleanup of the patch I posted
here:

 http://sourceware.org/ml/gdb-patches/2008-10/msg00449.html

This version, instead of overloading/abusing async_signal_handlers, comes up
with a similar (although not quite the same) async_event_handlers concept.

These async events are really very similar in implementation to
async_signal_handlers, except that, signal handlers should keep the current
behaviour of having high priority in relation to normal events (I changed
that before), while async_event_handlers should compete in the same weight
as the monitored file descriptors in the round-robin event source selection.

Then, I'm going to use async_event_handlers instead of async_signal_handlers
in gdb/remote.c for the extra target event sources in remote non-stop.
(that's just s/async_signal/async_event/g on top of the remote.c hunk I
had posted in the link above, I'll post an updated patch shortly.)

-- 
Pedro Alves

On Friday 17 October 2008 21:54:49, Pedro Alves wrote:

> That being said, I took a step back, and relooked at the problems I was
> having with async signals handlers, which is a mechanism to register a 
> callback function in the event-loop.  Notice that the currently event
> loop design is heavilly based on waitable file descriptors, with async
> signal handlers being a secondary input event source.
> 
> So I came up with the attached patch to adjust it to my needs.
> 
> The biggest problem the attached patch solves is:
> 
>  - Since async signal handlers are always checked before polling the
>    file descriptors, I can easily starve the file descriptor based
>    sources.  E.g., if I place several threads displace stepping a
>    breakpoint, forcing continuous remote traffic, the CLI becomes very,
>    very unresponsive, unusable really.  This is because stdin itself
>    is registered as a monitored (via select/poll) file descriptor.
> 
>  To solve this, I adjusted the event loop to give equal priority to
>  all event-sources (timers, async signal handlers, monitored file
>  descriptors).  The async signal handling was changed to instead
>  of immediatelly calling the associated callback, it installs an
>  event in the "ready" queue, just like the file-descriptor and
>  timer based sources.  I then make sure that I poll each of the
>  possible event sources once (select/poll with timeout 0 too).  If
>  if no event is found ready, then, we go blocking waiting for one
>  in select/poll.
> 
> I can sucessfully debug a non-stop linux gdbserver from both
> a linux host and a Windows (mingw32) host with this.
> 
> The remote.c changes below apply on top of the non-stop support
> patch I sent yesterday, and it's what I used to test, shown here
> so you could see what was required that change, in case you're
> curious about it.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: event_loop.diff
Type: text/x-diff
Size: 24682 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20081024/1125b476/attachment.bin>


More information about the Gdb-patches mailing list