]> granicus.if.org Git - graphviz/commit
remove reused buffer in spline routing
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Fri, 24 Dec 2021 18:11:06 +0000 (10:11 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Thu, 6 Jan 2022 01:08:40 +0000 (17:08 -0800)
commit00a066754c31ed45661f688132a221b9ad02feaf
tree7ce8039e6d937a389e07a31e1053892eb727c976
parentc7d68b6713bcf48043f7d66d8d997d24e993caf1
remove reused buffer in spline routing

Code in routespl.c used a long-lived buffer, `ps`, that it resized to deal with
various operations. This made the code thread-unsafe, and note that there are
also various work arounds in routespl.c to deal with re-entrancy which is
complicated by this design.

This commit rephrases `simpleSplineRoute` and `_routesplines` to dynamically
allocate a fresh buffer for each operation. The ergonomics cost of this is that
callers of `simpleSplineRoute`, `routesplines`, and `routepolylines` now need to
eventually free the returned pointer. This is unfortunately fairly noisy to deal
with in C and would have been cleaner in C++.

In future, this direction should probably be taken further to allow
`routesplinesinit` and `routesplinesterm` to be removed. This design that relies
on static globals is incompatible with multi-threading, so if Graphviz ever
wants to support multi-threading, this will need to be removed.

Note that this commit introduce two new warnings (for the `calloc` calls with
`int` values). The cost seems worth it and hopefully these warnings can be
removed in future.

This change has a performance impact. For smaller graphs, this likely slightly
degrades performance due to repeated small allocations that previously would not
have been required. For larger graphs, this perhaps improves performance as the
allocator no longer (spuriously) believes it needs to retain the contents of
`ps` across calls.
lib/common/routespl.c
lib/dotgen/dotsplines.c