From f7dfa77d6e8d68d3bdcc1c635546b49ec01ddac4 Mon Sep 17 00:00:00 2001 From: Matthew Fernandez Date: Sun, 4 Oct 2020 13:47:27 -0700 Subject: [PATCH] use a local instead of reusing global AF in gvrender_beziercurve There is a static global, AF, that is reused for a number of gvrender functions, but none need to retain previous data stored in this array. This hack presumably was from a time when allocators were much slower. Refactoring this into a local allocation makes this function thread safe and removes the need to unnecessarily prolong the lifetime of this allocation, thus decreasing Graphviz memory usage. This commit introduces a -Wshadow warning about AF, but that will be removed when we soon remove the static global. --- lib/gvc/gvrender.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/gvc/gvrender.c b/lib/gvc/gvrender.c index 0cc0a4b6a..c5a858de5 100644 --- a/lib/gvc/gvrender.c +++ b/lib/gvc/gvrender.c @@ -625,13 +625,13 @@ void gvrender_beziercurve(GVJ_t * job, pointf * af, int n, gvre->beziercurve(job, af, n, arrow_at_start, arrow_at_end, filled); else { - if (sizeAF < n) { - sizeAF = n + 10; - AF = grealloc(AF, sizeAF * sizeof(pointf)); - } + pointf *AF; + assert(n >= 0); + AF = gcalloc((size_t)n, sizeof(pointf)); gvrender_ptf_A(job, af, AF, n); gvre->beziercurve(job, AF, n, arrow_at_start, arrow_at_end, filled); + free(AF); } } } -- 2.40.0