| 225 | } |
| 226 | |
| 227 | bool 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 | |
| 275 | bool control_conn_t::check_dependents(service_record *service, bool &had_dependents) |
| 276 | { |
nothing calls this directly
no test coverage detected