MEDIUM: threads/proxy: Add a lock per proxy and atomically update proxy vars

Now, each proxy contains a lock that must be used when necessary to protect
it. Moreover, all proxy's counters are now updated using atomic operations.
diff --git a/src/backend.c b/src/backend.c
index d0810e2..475efa3 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -701,7 +701,7 @@
 			goto out;
 		}
 		else if (srv != prev_srv) {
-			s->be->be_counters.cum_lbconn++;
+			HA_ATOMIC_ADD(&s->be->be_counters.cum_lbconn, 1);
 			srv->counters.cum_lbconn++;
 		}
 		s->target = &srv->obj_type;
@@ -880,10 +880,10 @@
 				}
 				s->flags |= SF_REDISP;
 				prev_srv->counters.redispatches++;
-				s->be->be_counters.redispatches++;
+				HA_ATOMIC_ADD(&s->be->be_counters.redispatches, 1);
 			} else {
 				prev_srv->counters.retries++;
-				s->be->be_counters.retries++;
+				HA_ATOMIC_ADD(&s->be->be_counters.retries, 1);
 			}
 		}
 	}
@@ -1279,7 +1279,7 @@
 		}
 
 		srv->counters.failed_conns++;
-		s->be->be_counters.failed_conns++;
+		HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
 		return 1;
 
 	case SRV_STATUS_NOSRV:
@@ -1288,7 +1288,7 @@
 			s->si[1].err_type = SI_ET_CONN_ERR;
 		}
 
-		s->be->be_counters.failed_conns++;
+		HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
 		return 1;
 
 	case SRV_STATUS_QUEUED:
@@ -1309,7 +1309,7 @@
 			srv_set_sess_last(srv);
 		if (srv)
 			srv->counters.failed_conns++;
-		s->be->be_counters.failed_conns++;
+		HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
 
 		/* release other streams waiting for this server */
 		if (may_dequeue_tasks(srv, s->be))
@@ -1328,7 +1328,7 @@
 void set_backend_down(struct proxy *be)
 {
 	be->last_change = now.tv_sec;
-	be->down_trans++;
+	HA_ATOMIC_ADD(&be->down_trans, 1);
 
 	if (!(global.mode & MODE_STARTING)) {
 		Alert("%s '%s' has no server available!\n", proxy_type_str(be), be->id);