/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <limits.h> #include <stddef.h> #include <chrono> #include <exception> #include <functional> #include <memory> #include <variant> #include <vector> #include <folly/ExceptionWrapper.h> #include <folly/SocketAddress.h> #include <folly/String.h> #include <folly/io/ShutdownSocketSet.h> #include <folly/io/async/AsyncSocketBase.h> #include <folly/io/async/AsyncTimeout.h> #include <folly/io/async/DelayedDestruction.h> #include <folly/io/async/EventBase.h> #include <folly/io/async/EventBaseAtomicNotificationQueue.h> #include <folly/io/async/EventHandler.h> #include <folly/net/NetOps.h> #include <folly/net/NetworkSocket.h> #include <folly/observer/Observer.h> #include <folly/portability/Sockets.h> // Due to the way kernel headers are included, this may or may not be defined. // Number pulled from 3.10 kernel headers. #ifndef SO_REUSEPORT #define SO_REUSEPORT … #endif #if defined __linux__ && !defined SO_NO_TRANSPARENT_TLS #define SO_NO_TRANSPARENT_TLS … #endif namespace folly { /** * AsyncServerSocket is a listening socket that asynchronously informs a * callback whenever a new connection has been accepted. * * Unlike most async interfaces that always invoke their callback in the same * EventBase thread, AsyncServerSocket is unusual in that it can distribute * the callbacks across multiple EventBase threads. * This supports a common use case for network servers to distribute incoming * connections across a number of EventBase threads. (Servers typically run * with one EventBase thread per CPU.) * Despite being able to invoke callbacks in multiple EventBase threads, * AsyncServerSocket still has one "primary" EventBase. Operations that * modify the AsyncServerSocket state may only be performed from the primary * EventBase thread. * */ class AsyncServerSocket : public DelayedDestruction, public AsyncSocketBase { … }; } // namespace folly