},
};
-#if VALGRIND
-_destructor_ static void cleanup_pools(void) {
- _cleanup_free_ char *t = NULL;
+void hashmap_cleanup_pools(void) {
+ int r;
- /* Be nice to valgrind */
+ /* The pool is only allocated by the main thread, but the memory can be passed to other
+ * threads. Let's clean up if we are the main thread and no other threads are live. */
- /* The pool is only allocated by the main thread, but the memory can
- * be passed to other threads. Let's clean up if we are the main thread
- * and no other threads are live. */
- /* We build our own is_main_thread() here, which doesn't use C11
- * TLS based caching of the result. That's because valgrind apparently
- * doesn't like malloc() (which C11 TLS internally uses) to be called
- * from a GCC destructors. */
+ /* We build our own is_main_thread() here, which doesn't use C11 TLS based caching of the
+ * result. That's because valgrind apparently doesn't like TLS to be used from a GCC destructor. */
if (getpid() != gettid())
- return;
+ return (void) log_debug("Not cleaning up memory pools, not in main thread.");
- if (get_process_threads(0) != 1)
- return;
+ r = get_process_threads(0);
+ if (r < 0)
+ return (void) log_debug_errno(r, "Failed to determine number of threads, not cleaning up memory pools: %m");
+ if (r != 1)
+ return (void) log_debug("Not cleaning up memory pools, running in multi-threaded process.");
mempool_drop(&hashmap_pool);
mempool_drop(&ordered_hashmap_pool);
}
+
+#if VALGRIND
+_destructor_ static void cleanup_pools(void) {
+ /* Be nice to valgrind */
+ hashmap_cleanup_pools();
+}
#endif
static unsigned n_buckets(HashmapBase *h) {