There's actually a problem with memprofiles: the pool pointer is stored
in ->info but some pools are replaced during startup, such as the trash
pool, leaving a dangling pointer there.
Let's complete the API with a new function memprof_remove_stale_info()
that will remove all stale references to this info pointer. It's also
present when USE_MEMORY_PROFILING is not set so as to ease the job on
callers.
#ifdef USE_MEMORY_PROFILING
struct memprof_stats *memprof_get_bin(const void *ra, enum memprof_method meth);
+void memprof_remove_stale_info(const void *info);
+#else
+static inline void memprof_remove_stale_info(const void *info)
+{
+ /* nothing to do */
+}
#endif
#endif /* _HAPROXY_ACTIVITY_H */
_HA_ATOMIC_ADD(&bin->free_tot, size_before);
}
+/* remove info from entries matching <info>. This needs to be used by callers
+ * of pool_destroy() so that we don't keep a reference to a dead pool. Nothing
+ * is done if <info> is NULL.
+ */
+void memprof_remove_stale_info(const void *info)
+{
+ int i;
+
+ if (!info)
+ return;
+
+ for (i = 0; i < MEMPROF_HASH_BUCKETS; i++) {
+ if (_HA_ATOMIC_LOAD(&memprof_stats[i].info) == info)
+ _HA_ATOMIC_STORE(&memprof_stats[i].info, NULL);
+ }
+}
+
#endif // USE_MEMORY_PROFILING
/* Updates the current thread's statistics about stolen CPU time. The unit for