void bindImpl()

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);
    }
  }