FutureSync<void> TransportSocketCache::disconnect(MessageSocketPtr socket) { Promise<void> promiseSocketRemoved; { auto syncDisconnectInfos = _disconnectInfos.synchronize(); // TODO: Remove Promise<void>{} when get rid of VS2013. syncDisconnectInfos->push_back(DisconnectInfo{socket, Promise<void>{}}); promiseSocketRemoved = syncDisconnectInfos->back().promiseSocketRemoved; } // We wait that the socket has been disconnected _and_ the `disconnected` // signal has been received by the cache. FutureBarrier<void> barrier; barrier.addFuture(promiseSocketRemoved.future()); barrier.addFuture(socket->disconnect()); Promise<void> promise; return barrier.future().then([=](const std::vector<Future<void>>& v) mutable { const auto isInError = [](const Future<void>& f) { return f.hasError(); }; if (std::any_of(begin(v), end(v), isInError)) { promise.setError("disconnect error"); return; } promise.setValue(0); }); }