Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cdt-dev] Timeouts for GDB/MI commands (Was: [DSF] Making Sequence more robust)

> -----Original Message-----
> From: Vladimir Prus [mailto:vladimir@xxxxxxxxxxxxxxxx] 
> Sent: Monday, October 24, 2011 10:43 AM
> To: cdt-dev@xxxxxxxxxxx
> Cc: Marc Khouzam; Pawel Piech; Mikhail Khodjaiants
> Subject: Re: [cdt-dev] Timeouts for GDB/MI commands (Was: 
> [DSF] Making Sequence more robust)
> 
> On Monday, October 24, 2011 17:56:03 Marc Khouzam wrote:
> > > -----Original Message-----
> > > From: cdt-dev-bounces@xxxxxxxxxxx
> > > [mailto:cdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Vladimir Prus
> > > Sent: Saturday, October 22, 2011 5:55 AM
> > > To: Pawel Piech; Mikhail Khodjaiants
> > > Cc: cdt-dev@xxxxxxxxxxx
> > > Subject: [cdt-dev] Timeouts for GDB/MI commands (Was: [DSF]
> > > Making Sequence more robust)
> > 
> > Hi,
> > 
> > I think it would be great to add some timer infrastructure
> > for commands sent to GDB.  Thanks for pushing this forward.
> > Please see below for some comments.
> > 
> > > On Thursday, October 20, 2011 21:40:17 Pawel Piech wrote:
> > > > > 2. While a general repository for outstanding RM's might
> > > 
> > > be a good idea,
> > > 
> > > > > what would you say if we start small, and implement the
> > > 
> > > solution that
> > > 
> > > > > would remember outstanding RequestMonitor instances for
> > > 
> > > some limited
> > > 
> > > > > cases (for example, 'target *-remote' commands in
> > > 
> > > DSF-GDB, and then
> > > 
> > > > > cancel those RequestMonitors after a timeout? This is somewhat
> > > > > orthogonal from the initial goal of catching lost 
> RMs, but seems
> > > > > sufficiently related and immediately useful.
> > > > 
> > > > This is something that could be done at the service level,
> > > 
> > > where these
> > > 
> > > > commands are issued.  If we expect that the back-end may
> > > 
> > > never complete
> > > 
> > > > some commands then in those cases a timeout guard should even be
> > > > required.  For example, we queue commands with the command
> > > 
> > > control, but
> > > 
> > > > we count on the process monitor to notify us if the back
> > > 
> > > end process
> > > 
> > > > dies.  At that point we complete any outstanding command in
> > > 
> > > queue with
> > > 
> > > > an error.  So our process monitor is the guard.
> > > 
> > > We discussed this approach internally (turned out to be
> > > faster), and Mikhail has proposed approach like this:
> > > 
> > > 1. Add new interface:
> > >     interface IMIControlTimeoutPolicy {
> > >     
> > >         void commandSend(CommandHandle);
> > >         void commandDone(CommandHandle);
> > >     
> > >     }
> > 
> > ICommandListener has commandSent() and commandDone().
> > How about using 'sendCommand' and 'processCommandReply' to avoid
> > confusion?
> 
> Well, 'sendCommand' sounds like a methods that sends a command,
> as opposed to a method that is notified that a command is sent.
> Maybe, createTimeoutPolicy should just return ICommandListener?

So I mis-understood what you suggest.  When you say that TxThread/RxThread
would call these methods, I thought it was to send and receive
the commands in a way that could be overridden.

Instead, I gather you want to be able to do extra work when a
command is sent, so as to set a timer, right?
In that case, maybe you simply want to use the existing:
  ICommandControl.addCommandListener(ICommandListener)
then add a timer in there?


> > > 2. Add new method AbstractMIControl.createTimeoutPolicy
> > > (returning null by default).
> > > Adjust the code so that when this method returns non-null,
> > > the commandSend and commandDone
> > > methods of the result are called by TxThread/RxThread as 
> appropriate.
> > 
> > Sure, that mostly makes that code easy to override.
> > The interesting part will be the code that handles the timers.
> > 
> > > 3. Make GDBControl.createTimeoutPolicy return a policy that
> > > sets a timer whenever a command
> > > is sent, and if the command is not done within a timeout,
> > > just calls GDBControl.shutdown.
> > 
> > I wonder if such a solution is sufficient?
> > Do we want to recover for a missing reply, or should it never
> > happen and we can indeed just abort?
> > 
> > A more flexible solution, which may be overkill as it may never
> > be triggered would be to allow for different behaviors
> > for different MI commands and different timeouts as well
> > (I think CDI has that already).
> > 
> > How about adding some methods to MICommand?  Something like:
> >   getTimeout() // Returns timeout value for this MICommand
> >   timeout(RequestMonitor)    // Called if the timer expires before
> >                              // a reply has been received.  
> This method
> >                              // will decide what to do with the RM
> > 
> > We'd put in default implementation in MICommand, but it 
> would be possible
> > to override them in individual commands, such as 'target *-remote'.
> > 
> > I'm imagining that the MICommand.timeout(RM) will deal with the RM
> > so that the service that sent the command can decided what to do
> > in that case.
> > 
> > But again, this may be overkill if we don't expect this to happen
> > often or at all.
> > 
> > Are you trying to address a specific scenario or a general safety
> > mechanism?
> 
> We care both for initial connection timeout (-target-select) 
> and a case
> where target goes away in the middle of debug session (wedged board).
> We actually discussed individual handling for commands on 
> internal IRC,
> and Mikhail suggested this is not a good idea, since it was 
> implemented
> this way in CDI and just caused multiple error messages in case target
> is gone. Obviously, trying to implement error recovery for 
> all commands
> is a major undertaking in all cases.

If it wasn't so useful for CDI, let's not do it just yet for DSF :-)

> So, I would suggest not to complicate interface until we sure 
> per-command
> timeout policy is both useful and implementable.
> 
> What do you think?

Ok with me.

Marc

> 
> -- 
> Vladimir Prus
> CodeSourcery / Mentor Graphics
> +7 (812) 677-68-40
> 

Back to the top