s->flags |= SF_CURR_SESS;
count = _HA_ATOMIC_ADD(&srv->cur_sess, 1);
HA_ATOMIC_UPDATE_MAX(&srv->counters.cur_sess_max, count);
- if (s->be->lbprm.server_take_conn)
+ if (s->be->lbprm.server_take_conn) {
+ HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
s->be->lbprm.server_take_conn(srv);
+ HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
+ }
}
/* Now handle synchronously connected sockets. We know the stream-int
_HA_ATOMIC_SUB(&sess->srv_conn->served, 1);
_HA_ATOMIC_SUB(&sess->srv_conn->proxy->served, 1);
__ha_barrier_atomic_store();
- if (sess->srv_conn->proxy->lbprm.server_drop_conn)
+ if (sess->srv_conn->proxy->lbprm.server_drop_conn) {
+ HA_SPIN_LOCK(SERVER_LOCK, &sess->srv_conn->lock);
sess->srv_conn->proxy->lbprm.server_drop_conn(sess->srv_conn);
+ HA_SPIN_UNLOCK(SERVER_LOCK, &sess->srv_conn->lock);
+ }
stream_del_srv_conn(sess);
}
_HA_ATOMIC_ADD(&newsrv->served, 1);
_HA_ATOMIC_ADD(&newsrv->proxy->served, 1);
__ha_barrier_atomic_store();
- if (newsrv->proxy->lbprm.server_take_conn)
+ if (newsrv->proxy->lbprm.server_take_conn) {
+ HA_SPIN_LOCK(SERVER_LOCK, &newsrv->lock);
newsrv->proxy->lbprm.server_take_conn(newsrv);
+ HA_SPIN_UNLOCK(SERVER_LOCK, &newsrv->lock);
+ }
stream_add_srv_conn(sess, newsrv);
}
}