[PATCH] RFC: replay: Fix --loop to work when --singlethread is in effect

José Fonseca jose.r.fonseca at gmail.com
Tue Apr 23 00:12:11 PDT 2013


I agree.

Jose

On Mon, Apr 15, 2013 at 7:16 PM, Peter Lohrmann <peterl at valvesoftware.com>wrote:

> I think the getNextCall(..) option seems like a good approach.
>  - Peter
>
> -----Original Message-----
> From: apitrace-bounces+peterl=valvesoftware.com at lists.freedesktop.org[mailto:
> apitrace-bounces+peterl=valvesoftware.com at lists.freedesktop.org] On
> Behalf Of Carl Worth
> Sent: Monday, April 15, 2013 11:07 AM
> To: apitrace at lists.freedesktop.org
> Cc: Carl Worth
> Subject: [PATCH] RFC: replay: Fix --loop to work when --singlethread is in
> effect
>
> The original implementation of --loop was made only to the code
> implementing multi-threaded replay, (the RelayRunner class and friends), so
> that when --singlethread is in effect, the --loop option has no effect.
>
> This commit fixes the bug by copying the --loop logic to the
> single-threaded case as well.
>
> Thanks to Peter Lohrmann for reporting the bug.
> ---
>
> NOTE: This commit is ugly in that the implementation of --loop is copied
> to two places in the code. I'd really rather eliminate that copying, so
> this is sent out in some respect as a proof-of-concept, (and as a way to
> help Peter get past the current bug).
>
>
> One option to reduce code duplication would be to push the "if
> (singleThread)" condition down into the lower loop. But my first looks at
> doing that held little promise, (there are many places within the "relay
> race" that would have to be touched up with "if (singleThread)").
>
> Another option would be to have some sort of getNextCall function that
> both the single and multi-threaded code could use and then this function
> could hold all of the logic needed for --loop.
>
> I'm glad to do more of the legwork on the code here, but if someone has a
> strong opinion on what direction to go, I'd be glad to hear it.
>
>  retrace/retrace_main.cpp |   36 ++++++++++++++++++++++++++++++++++--
>  1 file changed, 34 insertions(+), 2 deletions(-)
>
> diff --git a/retrace/retrace_main.cpp b/retrace/retrace_main.cpp index
> 0c358e1..fd45e78 100644
> --- a/retrace/retrace_main.cpp
> +++ b/retrace/retrace_main.cpp
> @@ -517,10 +517,42 @@ mainLoop() {
>
>      if (singleThread) {
>          trace::Call *call;
> -        while ((call = parser.parse_call())) {
> +
> +        call = parser.parse_call();
> +
> +        /* If the user wants to loop we need to get a bookmark target. We
> +         * usually get this after replaying a call that ends a frame, but
> +         * for a trace that has only one frame we need to get it at the
> +         * beginning. */
> +        if (loopOnFinish) {
> +            parser.getBookmark(lastFrameStart);
> +        }
> +
> +        do {
> +            bool callEndsFrame = false;
> +            static trace::ParseBookmark frameStart;
> +
> +            if (loopOnFinish && call->flags & trace::CALL_FLAG_END_FRAME)
> {
> +                callEndsFrame = true;
> +                parser.getBookmark(frameStart);
> +            }
> +
>              retraceCall(call);
>              delete call;
> -        };
> +            call = parser.parse_call();
> +
> +            /* Restart last frame if looping is requested. */
> +            if (loopOnFinish) {
> +                if (!call) {
> +                    parser.setBookmark(lastFrameStart);
> +                    call = parser.parse_call();
> +                } else if (callEndsFrame) {
> +                    lastFrameStart = frameStart;
> +                }
> +            }
> +
> +        } while (call);
> +
>          flushRendering();
>      } else {
>          RelayRace race;
> --
> 1.7.10.4
>
> _______________________________________________
> apitrace mailing list
> apitrace at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/apitrace
> _______________________________________________
> apitrace mailing list
> apitrace at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/apitrace
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/apitrace/attachments/20130423/2ac8e23b/attachment.html>


More information about the apitrace mailing list