]> git.ipfire.org Git - thirdparty/squid.git/blob - src/comm/AcceptLimiter.h
Source Format Enforcement (#1234)
[thirdparty/squid.git] / src / comm / AcceptLimiter.h
1 /*
2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 #ifndef _SQUID_SRC_COMM_ACCEPT_LIMITER_H
10 #define _SQUID_SRC_COMM_ACCEPT_LIMITER_H
11
12 #include "comm/TcpAcceptor.h"
13
14 #include <deque>
15
16 namespace Comm
17 {
18
19 /**
20 * FIFO Queue holding listener socket handlers which have been activated
21 * ready to dupe their FD and accept() a new client connection.
22 * But when doing so there were not enough FD available to handle the
23 * new connection. These handlers are awaiting some FD to become free.
24 *
25 * defer - used only by Comm layer ConnAcceptor adding themselves when FD are limited.
26 * removeDead - used only by Comm layer ConnAcceptor to remove themselves when dying.
27 * kick - used by Comm layer when FD are closed.
28 */
29 class AcceptLimiter
30 {
31
32 public:
33 /** retrieve the global instance of the queue. */
34 static AcceptLimiter &Instance();
35
36 /** delay accepting a new client connection. */
37 void defer(const TcpAcceptor::Pointer &afd);
38
39 /** remove all records of an acceptor. Only to be called by the ConnAcceptor::swanSong() */
40 void removeDead(const TcpAcceptor::Pointer &afd);
41
42 /** try to accept and begin processing any delayed client connections. */
43 void kick();
44
45 private:
46 static AcceptLimiter Instance_;
47
48 /** FIFO queue */
49 std::deque<TcpAcceptor::Pointer> deferred_;
50 };
51
52 }; // namespace Comm
53
54 #endif /* _SQUID_SRC_COMM_ACCEPT_LIMITER_H */
55