1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-04-18 17:24:03 +03:00
mvfst/quic/server/QuicServerBackend.cpp
Matt Joras d153b04ec4 Add SeparateDefinitionBlocks to clang-format
Summary: As in title.

Reviewed By: kvtsoy

Differential Revision: D72543602

fbshipit-source-id: 6190b7fa541b1535eab565bac3da159c85781c0e
2025-04-07 13:20:35 -07:00

115 lines
2.9 KiB
C++

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <folly/io/async/EventBase.h>
#include <folly/io/async/EventBaseBackendBase.h>
#include <quic/server/QuicServer.h>
namespace quic {
#ifdef _WIN32
#include <mmsystem.h> // @manual
#include <timeapi.h> // @manual
#pragma comment(lib, "winmm.lib")
struct GetBetterWindowsTimers {
GetBetterWindowsTimers() {
CHECK_EQ(timeBeginPeriod(1), TIMERR_NOERROR);
}
~GetBetterWindowsTimers() {
timeEndPeriod(1);
}
};
GetBetterWindowsTimers timerGetter;
class WindowsEventBaseBackend : public folly::EventBaseBackendBase {
public:
WindowsEventBaseBackend();
explicit WindowsEventBaseBackend(event_base* evb);
~WindowsEventBaseBackend() override;
event_base* getEventBase() override {
return evb_;
}
int eb_event_base_loop(int flags) override;
int eb_event_base_loopbreak() override;
int eb_event_add(Event& event, const struct timeval* timeout) override;
int eb_event_del(EventBaseBackendBase::Event& event) override;
bool eb_event_active(Event& event, int res) override;
private:
event_base* evb_;
};
WindowsEventBaseBackend::WindowsEventBaseBackend() {
evb_ = event_base_new();
}
WindowsEventBaseBackend::WindowsEventBaseBackend(event_base* evb) : evb_(evb) {
if (UNLIKELY(evb_ == nullptr)) {
LOG(ERROR) << "EventBase(): Pass nullptr as event base.";
throw std::invalid_argument("EventBase(): event base cannot be nullptr");
}
}
int WindowsEventBaseBackend::eb_event_base_loop(int flags) {
return event_base_loop(evb_, flags);
}
int WindowsEventBaseBackend::eb_event_base_loopbreak() {
return event_base_loopbreak(evb_);
}
int WindowsEventBaseBackend::eb_event_add(
Event& event,
const struct timeval* timeout) {
return event_add(event.getEvent(), timeout);
}
int WindowsEventBaseBackend::eb_event_del(EventBaseBackendBase::Event& event) {
return event_del(event.getEvent());
}
bool WindowsEventBaseBackend::eb_event_active(Event& event, int res) {
event_active(event.getEvent(), res, 1);
return true;
}
WindowsEventBaseBackend::~WindowsEventBaseBackend() {
event_base_free(evb_);
}
static std::unique_ptr<folly::EventBaseBackendBase>
getWindowsEventBaseBackend() {
auto config = event_config_new();
event_config_set_flag(config, EVENT_BASE_FLAG_PRECISE_TIMER);
auto evb = event_base_new_with_config(config);
event_config_free(config);
std::unique_ptr<folly::EventBaseBackendBase> backend =
std::make_unique<WindowsEventBaseBackend>(evb);
return backend;
}
#endif
QuicServer::EventBaseBackendDetails QuicServer::getEventBaseBackendDetails() {
EventBaseBackendDetails ret;
#ifdef _WIN32
ret.factory = &getWindowsEventBaseBackend;
#else
ret.factory = &folly::EventBase::getDefaultBackend;
#endif
return ret;
}
} // namespace quic