// Copyright 2022 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_ #define QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_ #if defined(_WIN32) #include <winsock2.h> #else #include <poll.h> #endif #include <memory> #include "absl/container/btree_map.h" #include "absl/types/span.h" #include "quiche/quic/core/io/quic_event_loop.h" #include "quiche/quic/core/io/socket.h" #include "quiche/quic/core/quic_alarm.h" #include "quiche/quic/core/quic_alarm_factory.h" #include "quiche/quic/core/quic_clock.h" #include "quiche/common/quiche_linked_hash_map.h" namespace quic { // A simple and portable implementation of QuicEventLoop using poll(2). Works // on all POSIX platforms (and can be potentially made to support Windows using // WSAPoll). // // For most operations, this implementation has a typical runtime of // O(N + log M), where N is the number of file descriptors, and M is the number // of pending alarms. // // This API has to deal with the situations where callbacks are modified from // the callbacks themselves. To address this, we use the following two // approaches: // 1. The code does not execute any callbacks until the very end of the // processing, when all of the state for the event loop is consistent. // 2. The callbacks are stored as weak pointers, since other callbacks can // cause them to be unregistered. class QuicPollEventLoop : public QuicEventLoop { … }; class QuicPollEventLoopFactory : public QuicEventLoopFactory { … }; } // namespace quic #endif // QUICHE_QUIC_CORE_IO_QUIC_POLL_EVENT_LOOP_H_