MEDIUM: threads/server: Use the server lock to protect health check and cli concurrency
diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c
index a4adb21..60becb0 100644
--- a/src/hlua_fcn.c
+++ b/src/hlua_fcn.c
@@ -626,7 +626,9 @@
 	struct server *srv;
 
 	srv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &srv->lock);
 	srv_shutdown_streams(srv, SF_ERR_KILLED);
+	SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 	return 0;
 }
 
@@ -635,7 +637,9 @@
 	struct server *srv;
 
 	srv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &srv->lock);
 	srv_adm_set_drain(srv);
+	SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 	return 0;
 }
 
@@ -644,7 +648,9 @@
 	struct server *srv;
 
 	srv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &srv->lock);
 	srv_adm_set_maint(srv);
+	SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 	return 0;
 }
 
@@ -653,7 +659,9 @@
 	struct server *srv;
 
 	srv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &srv->lock);
 	srv_adm_set_ready(srv);
+	SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
 	return 0;
 }
 
@@ -662,9 +670,11 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (sv->check.state & CHK_ST_CONFIGURED) {
 		sv->check.state |= CHK_ST_ENABLED;
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }
 
@@ -673,9 +683,11 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (sv->check.state & CHK_ST_CONFIGURED) {
 		sv->check.state &= ~CHK_ST_ENABLED;
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }
 
@@ -685,8 +697,10 @@
 
 	sv = hlua_check_server(L, 1);
 	if (!(sv->track)) {
+		SPIN_LOCK(SERVER_LOCK, &sv->lock);
 		sv->check.health = sv->check.rise + sv->check.fall - 1;
 		srv_set_running(sv, "changed from Lua script", NULL);
+		SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	}
 	return 0;
 }
@@ -697,8 +711,10 @@
 
 	sv = hlua_check_server(L, 1);
 	if (!(sv->track)) {
+		SPIN_LOCK(SERVER_LOCK, &sv->lock);
 		sv->check.health = sv->check.rise + sv->check.fall - 1;
 		srv_set_stopping(sv, "changed from Lua script", NULL);
+		SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	}
 	return 0;
 }
@@ -708,10 +724,12 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (!(sv->track)) {
 		sv->check.health = 0;
 		srv_set_stopped(sv, "changed from Lua script", NULL);
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }
 
@@ -720,9 +738,11 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (sv->agent.state & CHK_ST_CONFIGURED) {
 		sv->agent.state |= CHK_ST_ENABLED;
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }
 
@@ -731,9 +751,11 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (sv->agent.state & CHK_ST_CONFIGURED) {
 		sv->agent.state &= ~CHK_ST_ENABLED;
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }
 
@@ -742,10 +764,12 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (sv->agent.state & CHK_ST_ENABLED) {
 		sv->agent.health = sv->agent.rise + sv->agent.fall - 1;
 		srv_set_running(sv, "changed from Lua script", NULL);
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }
 
@@ -754,10 +778,12 @@
 	struct server *sv;
 
 	sv = hlua_check_server(L, 1);
+	SPIN_LOCK(SERVER_LOCK, &sv->lock);
 	if (sv->agent.state & CHK_ST_ENABLED) {
 		sv->agent.health = 0;
 		srv_set_stopped(sv, "changed from Lua script", NULL);
 	}
+	SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
 	return 0;
 }