u_debug_refcnt: Don't loop for initial refcounts if the initial value is huge
authorJesse Natalie <jenatali@microsoft.com>
Tue, 26 Apr 2022 19:41:12 +0000 (12:41 -0700)
committerMarge Bot <emma+marge@anholt.net>
Mon, 2 May 2022 16:58:20 +0000 (16:58 +0000)
Some components use very large refcounts to bypass atomics in single-threaded
cases, and this produces near-infinite loops when these resources are created.

Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16182>

src/util/u_debug_refcnt.c

index 06498eb..566fb9c 100644 (file)
@@ -174,10 +174,12 @@ debug_reference_slowpath(const struct pipe_reference *p,
          /* this is here to provide a gradual change even if we don't see
           * the initialization
           */
-         for (i = 1; i <= refcnt - change; ++i) {
-            fprintf(stream, "<%s> %p %u AddRef %u\n", buf, (void *) p,
-                    serial, i);
-            debug_backtrace_print(stream, frames, STACK_LEN);
+         if (refcnt <= 10) {
+            for (i = 1; i <= refcnt - change; ++i) {
+               fprintf(stream, "<%s> %p %u AddRef %u\n", buf, (void *) p,
+                  serial, i);
+               debug_backtrace_print(stream, frames, STACK_LEN);
+            }
          }
       }