MCPcopy Create free account
hub / github.com/davmac314/dinit / process_close_handle

Method process_close_handle

src/control.cc:227–273  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

225}
226
227bool control_conn_t::process_close_handle()
228{
229 constexpr int pkt_size = 1 + sizeof(handle_t);
230
231 if (rbuf.get_length() < pkt_size) {
232 chklen = pkt_size;
233 return true;
234 }
235
236 handle_t handle;
237 rbuf.extract((char *) &handle, 1, sizeof(handle));
238
239 rbuf.consume(pkt_size);
240 chklen = 0;
241
242 auto key_it = key_service_map.find(handle);
243 if (key_it == key_service_map.end()) {
244 // Service handle is bad
245 char badreq_rep[] = { (char)cp_rply::BADREQ };
246 if (!queue_packet(badreq_rep, 1)) return false;
247 bad_conn_close = true;
248 return true;
249 }
250
251 service_record *service = key_it->second;
252 key_service_map.erase(key_it);
253
254 bool have_other_handle = false;
255 auto handle_range = service_key_map.equal_range(service);
256 auto it = handle_range.first;
257 while (it->second != handle) {
258 have_other_handle = true;
259 ++it;
260 }
261 if (!have_other_handle) {
262 // check if more handles beyond the found handle
263 have_other_handle = std::next(it) != handle_range.second;
264 }
265 service_key_map.erase(it);
266
267 if (!have_other_handle) {
268 service->remove_listener(this);
269 }
270
271 char ack_reply[] = { (char)cp_rply::ACK };
272 return queue_packet(ack_reply, sizeof(ack_reply));
273}
274
275bool control_conn_t::check_dependents(service_record *service, bool &had_dependents)
276{

Callers

nothing calls this directly

Calls 7

get_lengthMethod · 0.80
extractMethod · 0.80
consumeMethod · 0.80
eraseMethod · 0.80
findMethod · 0.45
endMethod · 0.45
remove_listenerMethod · 0.45

Tested by

no test coverage detected