]>
Commit | Line | Data |
---|---|---|
40daaeb8 | 1 | /* |
5b74111a | 2 | * Copyright (C) 1996-2018 The Squid Software Foundation and contributors |
bbc27441 AJ |
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. | |
40daaeb8 AR |
7 | */ |
8 | ||
bbc27441 AJ |
9 | /* DEBUG: section 54 Interprocess Communication */ |
10 | ||
f7f3304a | 11 | #include "squid.h" |
96a20046 | 12 | #include "base/TextException.h" |
67679543 | 13 | #include "globals.h" |
40daaeb8 | 14 | #include "ipc/Kids.h" |
4d5904f7 | 15 | #include "SquidConfig.h" |
602d9612 | 16 | #include "tools.h" |
40daaeb8 AR |
17 | |
18 | Kids TheKids; | |
9de6c973 | 19 | KidName TheKidName; |
40daaeb8 AR |
20 | |
21 | Kids::Kids() | |
22 | { | |
23 | } | |
24 | ||
25 | /// maintain n kids | |
095ec2b1 | 26 | void Kids::init() |
40daaeb8 | 27 | { |
c33a88ca | 28 | storage.clear(); |
40daaeb8 | 29 | |
095ec2b1 | 30 | storage.reserve(NumberOfKids()); |
40daaeb8 | 31 | |
10cefb7b | 32 | char kid_name[32]; |
ba568924 | 33 | |
095ec2b1 AR |
34 | // add Kid records for all workers |
35 | for (int i = 0; i < Config.workers; ++i) { | |
36 | snprintf(kid_name, sizeof(kid_name), "(squid-%d)", (int)(storage.size()+1)); | |
37 | storage.push_back(Kid(kid_name)); | |
38 | } | |
39 | ||
40 | // add Kid records for all disk processes | |
3b581957 | 41 | for (int i = 0; i < Config.cacheSwap.n_strands; ++i) { |
095ec2b1 | 42 | snprintf(kid_name, sizeof(kid_name), "(squid-disk-%d)", (int)(storage.size()+1)); |
40daaeb8 AR |
43 | storage.push_back(Kid(kid_name)); |
44 | } | |
10cefb7b | 45 | |
ba568924 | 46 | // if coordination is needed, add a Kid record for Coordinator |
095ec2b1 AR |
47 | if (storage.size() > 1) { |
48 | snprintf(kid_name, sizeof(kid_name), "(squid-coord-%d)", (int)(storage.size()+1)); | |
10cefb7b | 49 | storage.push_back(Kid(kid_name)); |
50 | } | |
96a20046 DK |
51 | |
52 | Must(storage.size() == static_cast<size_t>(NumberOfKids())); | |
40daaeb8 AR |
53 | } |
54 | ||
55 | /// returns kid by pid | |
56 | Kid* Kids::find(pid_t pid) | |
57 | { | |
58 | assert(pid > 0); | |
59 | assert(count() > 0); | |
60 | ||
61 | for (size_t i = 0; i < storage.size(); ++i) { | |
62 | if (storage[i].getPid() == pid) | |
63 | return &storage[i]; | |
64 | } | |
65 | return NULL; | |
66 | } | |
67 | ||
68 | /// returns the kid by index, useful for kids iteration | |
69 | Kid& Kids::get(size_t i) | |
70 | { | |
1dc746da | 71 | assert(i < count()); |
40daaeb8 AR |
72 | return storage[i]; |
73 | } | |
74 | ||
75 | /// whether all kids are hopeless | |
76 | bool Kids::allHopeless() const | |
77 | { | |
78 | for (size_t i = 0; i < storage.size(); ++i) { | |
79 | if (!storage[i].hopeless()) | |
80 | return false; | |
81 | } | |
82 | return true; | |
83 | } | |
84 | ||
00e2479d AR |
85 | void |
86 | Kids::forgetAllFailures() | |
87 | { | |
88 | for (auto &kid: storage) | |
89 | kid.forgetFailures(); | |
90 | } | |
91 | ||
92 | time_t | |
93 | Kids::forgetOldFailures() | |
94 | { | |
95 | time_t nextCheckDelay = 0; | |
96 | for (auto &kid: storage) { | |
97 | if (!kid.hopeless()) | |
98 | continue; | |
99 | ||
100 | const auto deathDuration = kid.deathDuration(); // protect from time changes | |
101 | if (Config.hopelessKidRevivalDelay <= deathDuration) { | |
102 | kid.forgetFailures(); // this kid will be revived now | |
103 | continue; | |
104 | } | |
105 | ||
106 | const auto remainingDeathTime = Config.hopelessKidRevivalDelay - deathDuration; | |
107 | assert(remainingDeathTime > 0); | |
108 | if (remainingDeathTime < nextCheckDelay || !nextCheckDelay) | |
109 | nextCheckDelay = remainingDeathTime; | |
110 | } | |
111 | return nextCheckDelay; // still zero if there were no still-hopeless kids | |
112 | } | |
113 | ||
40daaeb8 AR |
114 | /// whether all kids called exited happy |
115 | bool Kids::allExitedHappy() const | |
116 | { | |
117 | for (size_t i = 0; i < storage.size(); ++i) { | |
118 | if (!storage[i].exitedHappy()) | |
119 | return false; | |
120 | } | |
121 | return true; | |
122 | } | |
123 | ||
ca4b9ee6 DK |
124 | /// whether some kids died from a given signal |
125 | bool Kids::someSignaled(const int sgnl) const | |
40daaeb8 AR |
126 | { |
127 | for (size_t i = 0; i < storage.size(); ++i) { | |
ca4b9ee6 DK |
128 | if (storage[i].signaled(sgnl)) |
129 | return true; | |
40daaeb8 | 130 | } |
ca4b9ee6 DK |
131 | return false; |
132 | } | |
133 | ||
134 | /// whether some kids are running | |
135 | bool Kids::someRunning() const | |
136 | { | |
137 | for (size_t i = 0; i < storage.size(); ++i) { | |
138 | if (storage[i].running()) | |
139 | return true; | |
140 | } | |
141 | return false; | |
142 | } | |
143 | ||
144 | /// whether some kids should be restarted by master | |
145 | bool Kids::shouldRestartSome() const | |
146 | { | |
147 | for (size_t i = 0; i < storage.size(); ++i) { | |
148 | if (storage[i].shouldRestart()) | |
149 | return true; | |
150 | } | |
151 | return false; | |
40daaeb8 AR |
152 | } |
153 | ||
154 | /// returns the number of kids | |
155 | size_t Kids::count() const | |
156 | { | |
157 | return storage.size(); | |
158 | } | |
f53969cc | 159 |