#include <haproxy/tools.h>
#include <haproxy/uri_auth.h>
+/* Lock to ensure multiple backends deletion concurrently is safe */
+static __decl_spinlock(proxies_del_lock);
int listeners; /* # of proxy listeners, set by cfgparse */
struct proxy *proxies_list = NULL; /* list of main proxies */
struct logger *log, *logb;
struct lf_expr *lf, *lfb;
+ /* First release from global elements under lock protection. */
+ HA_SPIN_LOCK(PROXIES_DEL_LOCK, &proxies_del_lock);
/* note that the node's key points to p->id */
cebis_item_delete((px->cap & PR_CAP_DEF) ? &defproxy_by_name : &proxy_by_name, conf.name_node, id, px);
- ha_free(&px->id);
LIST_DEL_INIT(&px->global_list);
+ HA_SPIN_UNLOCK(PROXIES_DEL_LOCK, &proxies_del_lock);
+
+ /* Now release internal proxy elements. */
+ ha_free(&px->id);
drop_file_name(&px->conf.file);
counters_fe_shared_drop(&px->fe_counters.shared);
counters_be_shared_drop(&px->be_counters.shared);
case QC_CID_LOCK: return "QC_CID";
case CACHE_LOCK: return "CACHE";
case GUID_LOCK: return "GUID";
+ case PROXIES_DEL_LOCK: return "PROXIES_DEL";
case OTHER_LOCK: return "OTHER";
case DEBUG1_LOCK: return "DEBUG1";
case DEBUG2_LOCK: return "DEBUG2";