| 681 | } |
| 682 | |
| 683 | struct peer *random_peer(struct daemon *daemon, |
| 684 | bool (*check_peer)(const struct peer *peer)) |
| 685 | { |
| 686 | u64 target = UINT64_MAX; |
| 687 | struct peer *best = NULL, *i; |
| 688 | |
| 689 | /* Reservoir sampling */ |
| 690 | list_for_each(&daemon->peers, i, list) { |
| 691 | u64 r; |
| 692 | |
| 693 | if (!check_peer(i)) |
| 694 | continue; |
| 695 | |
| 696 | r = pseudorand_u64(); |
| 697 | if (r <= target) { |
| 698 | best = i; |
| 699 | target = r; |
| 700 | } |
| 701 | } |
| 702 | return best; |
| 703 | } |
| 704 | |
| 705 | /* This is called when lightningd or connectd closes its connection to |
| 706 | * us. We simply exit. */ |
no test coverage detected