- if (!server.isListening()) {
- // zombie?
- auto old_pid = server.getPid();
- if (server.tryWait()) {
- pids.erase(old_pid);
- auto pid = server.start();
- if (pid.has_value()) {
- pids[*pid] = &server;
+ Retry server_is_listening{[&] {
+ if (!server.isListening()) {
+ // zombie?
+ auto old_pid = server.getPid();
+ if (server.tryWait()) {
+ cerr << "zombie collected (old pid=" << old_pid << "): " << server << "\n";
+ pids.erase(old_pid);
+ // restart
+ startServer(server);
+ }
+ if (!server.isListening()) {
+ return false;