in wangle/bootstrap/ServerBootstrap.h [214:271]
void bindImpl(folly::SocketAddress& address) {
if (!workerFactory_) {
group(nullptr);
}
bool reusePort = reusePort_ || (acceptor_group_->numThreads() > 1) ||
accConfig_.reusePort;
std::mutex sock_lock;
std::vector<std::shared_ptr<folly::AsyncSocketBase>> new_sockets;
std::exception_ptr exn;
auto startupFunc = [&](std::shared_ptr<folly::Baton<>> barrier) {
try {
auto socket = socketFactory_->newSocket(
address, socketConfig.acceptBacklog, reusePort, socketConfig);
sock_lock.lock();
new_sockets.push_back(socket);
sock_lock.unlock();
socket->getAddress(&address);
barrier->post();
} catch (...) {
exn = std::current_exception();
barrier->post();
return;
}
};
auto wait0 = std::make_shared<folly::Baton<>>();
acceptor_group_->add(std::bind(startupFunc, wait0));
wait0->wait();
for (size_t i = 1; i < acceptor_group_->numThreads(); i++) {
auto barrier = std::make_shared<folly::Baton<>>();
acceptor_group_->add(std::bind(startupFunc, barrier));
barrier->wait();
}
if (exn) {
std::rethrow_exception(exn);
}
for (auto& socket : new_sockets) {
// Startup all the threads
workerFactory_->forEachWorker([this, socket](Acceptor* worker) {
socket->getEventBase()->runImmediatelyOrRunInEventBaseThreadAndWait(
[this, worker, socket]() {
socketFactory_->addAcceptCB(
socket, worker, worker->getEventBase());
});
});
sockets_->push_back(socket);
}
}