On Fri, Nov 16, 2018 at 04:05:11PM -0700, Mathieu Poirier wrote:

[...]

> > -static int cs_etm__flush(struct cs_etm_queue *etmq)
> > +static int cs_etm__flush(struct cs_etm_queue *etmq, bool new_packet)
> >  {
> >     int err = 0;
> >     struct cs_etm_auxtrace *etm = etmq->etm;
> > @@ -989,6 +989,20 @@ static int cs_etm__flush(struct cs_etm_queue *etmq)
> >  
> >     }
> >  
> > +   /*
> > +    * If 'new_packet' is false, this time call has no a new packet
> > +    * coming and 'etmq->packet' contains the stale packet which is
> > +    * set at the previous time with packets swapping.  In this case
> > +    * this function is invoked only for flushing branch stack at
> > +    * the end of buffer handling.
> > +    *
> > +    * Simply to say, branch samples should be generated when every
> > +    * time receive one new packet; otherwise, directly bail out to
> > +    * avoid generate branch sample with stale packet.
> > +    */
> > +   if (!new_packet)
> > +           return 0;
> > +
> >     if (etm->sample_branches &&
> >         etmq->prev_packet->sample_type == CS_ETM_RANGE) {
> >             err = cs_etm__synth_branch_sample(etmq);
> > @@ -1075,7 +1089,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue 
> > *etmq)
> >                                      * Discontinuity in trace, flush
> >                                      * previous branch stack
> >                                      */
> > -                                   cs_etm__flush(etmq);
> > +                                   cs_etm__flush(etmq, true);
> >                                     break;
> >                             case CS_ETM_EMPTY:
> >                                     /*
> > @@ -1092,7 +1106,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue 
> > *etmq)
> >  
> >             if (err == 0)
> >                     /* Flush any remaining branch stack entries */
> > -                   err = cs_etm__flush(etmq);
> > +                   err = cs_etm__flush(etmq, false);
> 
> I understand what you're doing and it will yield the correct results.  What 
> I'm
> not sure about is if we wouldn't be better off splitting cs_etm__flush()
> in order to reduce the complexity of the main decoding loop.  That is rename
> cs_etm__flush() to something like cs_etm__trace_on() and spin off a new
> cs_etm__end_block().  
> 
> It does introduce a little bit of code duplication but I think we'd win in 
> terms
> of readability and flexibility.

Sorry for long delay, Mathieu.

Agree with the idea of splitting cs_etm__flush() into two functions.
Will spin patch for new version.

Thanks,
Leo Yan

> >     }
> >  
> >     return err;
> > -- 
> > 2.7.4
> > 

Reply via email to