| 130 | } |
| 131 | |
| 132 | void disconnect_peer(struct peer *peer) |
| 133 | { |
| 134 | peer->draining_state = READING_FROM_SUBDS; |
| 135 | |
| 136 | for (size_t i = 0; i < tal_count(peer->subds); i++) { |
| 137 | /* Start timer in case it doesn't close by itself */ |
| 138 | if (peer->subds[i]->conn) { |
| 139 | status_peer_debug(&peer->id, "disconnect_peer: setting 5 second timer for subd %zu/%zu.", |
| 140 | i, tal_count(peer->subds)); |
| 141 | notleak(new_reltimer(&peer->daemon->timers, peer->subds[i], |
| 142 | time_from_sec(5), |
| 143 | close_subd_timeout, peer->subds[i])); |
| 144 | } else { |
| 145 | /* We told lightningd that peer spoke, but it hasn't returned yet. */ |
| 146 | tal_arr_remove(&peer->subds, i); |
| 147 | i--; |
| 148 | } |
| 149 | } |
| 150 | |
| 151 | if (tal_count(peer->subds) != 0) { |
| 152 | status_peer_debug(&peer->id, "disconnect_peer: waking %zu subds.", |
| 153 | tal_count(peer->subds)); |
| 154 | /* Wake them up so we read again */ |
| 155 | io_wake(&peer->subds); |
| 156 | } else { |
| 157 | status_peer_debug(&peer->id, "disconnect_peer: no subds, draining now."); |
| 158 | /* No subds left, start draining peer */ |
| 159 | drain_peer(peer); |
| 160 | } |
| 161 | } |
| 162 | |
| 163 | static void free_all_subds(struct peer *peer) |
| 164 | { |
no test coverage detected