#endif // USE_THREAD
+/* adjust the listener's state */
+void listener_set_state(struct listener *l, enum li_state st)
+{
+ l->state = st;
+}
+
/* This function adds the specified listener's file descriptor to the polling
* lists if it is in the LI_LISTEN state. The listener enters LI_READY or
* LI_FULL state depending on its number of connections. In daemon mode, we
do_unbind_listener(listener, 1);
else {
do_unbind_listener(listener, 0);
- listener->state = LI_LISTEN;
+ listener_set_state(listener, LI_LISTEN);
}
}
else if (!listener->maxconn || listener->nbconn < listener->maxconn) {
fd_want_recv(listener->rx.fd);
- listener->state = LI_READY;
+ listener_set_state(listener, LI_READY);
}
else {
- listener->state = LI_FULL;
+ listener_set_state(listener, LI_FULL);
}
}
/* if this listener is supposed to be only in the master, close it in the workers */
if (listener->state == LI_READY)
fd_stop_recv(listener->rx.fd);
MT_LIST_DEL(&listener->wait_queue);
- listener->state = LI_LISTEN;
+ listener_set_state(listener, LI_LISTEN);
end:
HA_SPIN_UNLOCK(LISTENER_LOCK, &listener->lock);
}
MT_LIST_DEL(&l->wait_queue);
fd_stop_recv(l->rx.fd);
- l->state = LI_PAUSED;
+ listener_set_state(l, LI_PAUSED);
end:
HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
return ret;
goto end;
if (l->maxconn && l->nbconn >= l->maxconn) {
- l->state = LI_FULL;
+ listener_set_state(l, LI_FULL);
goto end;
}
fd_want_recv(l->rx.fd);
- l->state = LI_READY;
+ listener_set_state(l, LI_READY);
end:
HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
return ret;
MT_LIST_DEL(&l->wait_queue);
if (l->state != LI_FULL) {
fd_stop_recv(l->rx.fd);
- l->state = LI_FULL;
+ listener_set_state(l, LI_FULL);
}
}
HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
if (l->state == LI_READY) {
MT_LIST_TRY_ADDQ(list, &l->wait_queue);
fd_stop_recv(l->rx.fd);
- l->state = LI_LIMITED;
+ listener_set_state(l, LI_LIMITED);
}
HA_SPIN_UNLOCK(LISTENER_LOCK, &l->lock);
}
MT_LIST_DEL(&listener->wait_queue);
if (listener->state >= LI_PAUSED) {
- listener->state = LI_ASSIGNED;
+ listener_set_state(listener, LI_ASSIGNED);
fd_stop_both(listener->rx.fd);
}
l->rx.fd = fd;
memcpy(&l->rx.addr, ss, sizeof(*ss));
MT_LIST_INIT(&l->wait_queue);
- l->state = LI_INIT;
+ listener_set_state(l, LI_INIT);
proto->add(l, port);
HA_SPIN_LOCK(PROTO_LOCK, &proto_lock);
HA_SPIN_LOCK(LISTENER_LOCK, &listener->lock);
if (listener->state == LI_ASSIGNED) {
- listener->state = LI_INIT;
+ listener_set_state(listener, LI_INIT);
LIST_DEL(&listener->rx.proto_list);
listener->rx.proto->nb_listeners--;
_HA_ATOMIC_SUB(&jobs, 1);
#endif
/* the socket is ready */
- listener->state = LI_LISTEN;
+ listener_set_state(listener, LI_LISTEN);
goto tcp_return;
tcp_close_return:
{
if (listener->state != LI_INIT)
return;
- listener->state = LI_ASSIGNED;
+ listener_set_state(listener, LI_ASSIGNED);
listener->rx.proto = &proto_tcpv4;
((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
LIST_ADDQ(&proto_tcpv4.listeners, &listener->rx.proto_list);
{
if (listener->state != LI_INIT)
return;
- listener->state = LI_ASSIGNED;
+ listener_set_state(listener, LI_ASSIGNED);
listener->rx.proto = &proto_tcpv6;
((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
LIST_ADDQ(&proto_tcpv6.listeners, &listener->rx.proto_list);
goto udp_return;
}
- listener->state = LI_LISTEN;
+ listener_set_state(listener, LI_LISTEN);
udp_return:
if (msg && errlen) {
{
if (listener->state != LI_INIT)
return;
- listener->state = LI_ASSIGNED;
+ listener_set_state(listener, LI_ASSIGNED);
listener->rx.proto = &proto_udp4;
((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
LIST_ADDQ(&proto_udp4.listeners, &listener->rx.proto_list);
{
if (listener->state != LI_INIT)
return;
- listener->state = LI_ASSIGNED;
+ listener_set_state(listener, LI_ASSIGNED);
listener->rx.proto = &proto_udp6;
((struct sockaddr_in *)(&listener->rx.addr))->sin_port = htons(port);
LIST_ADDQ(&proto_udp6.listeners, &listener->rx.proto_list);