2018-02-04 03:22:01 +01:00
|
|
|
// Matrix Construct
|
|
|
|
//
|
|
|
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
|
|
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
|
|
// copyright notice and this permission notice is present in all copies. The
|
|
|
|
// full license for this software is available in the LICENSE file.
|
2017-09-21 04:31:54 +02:00
|
|
|
|
2019-09-26 05:30:26 +02:00
|
|
|
#ifndef HAVE_IRCD_ASIO_H
|
2017-09-21 04:31:54 +02:00
|
|
|
#define HAVE_IRCD_ASIO_H
|
|
|
|
|
|
|
|
///
|
|
|
|
/// Boost library
|
|
|
|
///
|
|
|
|
/// It is better to add a boost header which we have omitted here rather than
|
|
|
|
/// in your definition file, and then #include <ircd/asio.h>. This is because
|
|
|
|
/// we can compose a precompiled header for your definition file much easier
|
|
|
|
/// this way.
|
|
|
|
///
|
|
|
|
|
2019-09-26 05:30:26 +02:00
|
|
|
// ircd.h is included here so that it can be compiled into this header. Then
|
|
|
|
// this becomes the single leading precompiled header.
|
|
|
|
#include <ircd/ircd.h>
|
|
|
|
|
2020-02-26 20:33:15 +01:00
|
|
|
// Boost preambles
|
2022-06-14 23:10:42 +02:00
|
|
|
#define BOOST_COROUTINES_NO_DEPRECATION_WARNING
|
2019-02-16 22:51:55 +01:00
|
|
|
#include <boost/version.hpp>
|
2020-02-26 20:33:15 +01:00
|
|
|
#include <boost/config.hpp>
|
2020-02-26 01:32:37 +01:00
|
|
|
|
2020-02-26 20:33:15 +01:00
|
|
|
// Workarounds / fixes
|
2020-02-26 01:32:37 +01:00
|
|
|
#if BOOST_VERSION >= 107000
|
|
|
|
namespace boost
|
|
|
|
{
|
|
|
|
using std::begin;
|
|
|
|
using std::end;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-06-14 23:10:42 +02:00
|
|
|
#include <RB_INC_SIGNAL_H
|
|
|
|
#include <RB_INC_SYS_MMAN_H
|
|
|
|
#include <RB_INC_SYS_EVENT_H
|
|
|
|
#include <RB_INC_SYS_EPOLL_H
|
|
|
|
#include <RB_INC_SYS_TIMERFD_H
|
|
|
|
#include <RB_INC_SYS_EVENTFD_H
|
|
|
|
|
|
|
|
#pragma GCC visibility push(internal)
|
|
|
|
#include <boost/throw_exception.hpp>
|
|
|
|
#pragma GCC visibility pop
|
|
|
|
|
2020-02-26 20:33:15 +01:00
|
|
|
#include <boost/system/system_error.hpp>
|
2022-06-14 23:10:42 +02:00
|
|
|
#include <boost/date_time/posix_time/ptime.hpp>
|
|
|
|
#include <boost/asio/detail/config.hpp>
|
|
|
|
#include <boost/asio/detail/socket_types.hpp>
|
|
|
|
#include <boost/asio/ssl/detail/openssl_types.hpp>
|
|
|
|
#include <boost/coroutine/coroutine.hpp>
|
2020-02-26 20:33:15 +01:00
|
|
|
|
2022-06-14 23:10:42 +02:00
|
|
|
#if defined(BOOST_ASIO_HAS_EPOLL) || defined(BOOST_ASIO_HAS_KQUEUE)
|
|
|
|
#pragma GCC visibility push(protected)
|
|
|
|
#endif
|
2017-09-21 04:31:54 +02:00
|
|
|
#include <boost/asio.hpp>
|
2022-06-14 23:10:42 +02:00
|
|
|
#include <boost/asio/io_service.hpp>
|
2017-09-21 04:31:54 +02:00
|
|
|
#include <boost/asio/steady_timer.hpp>
|
|
|
|
#include <boost/asio/spawn.hpp>
|
2022-06-14 23:10:42 +02:00
|
|
|
#include <boost/asio/ssl.hpp>
|
|
|
|
#if defined(BOOST_ASIO_HAS_EPOLL) || defined(BOOST_ASIO_HAS_KQUEUE)
|
2019-05-02 23:13:27 +02:00
|
|
|
#pragma GCC visibility pop
|
2022-06-14 23:10:42 +02:00
|
|
|
#endif
|
2017-09-21 04:31:54 +02:00
|
|
|
|
2020-02-27 19:11:59 +01:00
|
|
|
// Boost version dependent behavior for getting the io_service/io_context
|
|
|
|
// abstract executor (recent versions) or the derived instance (old versions).
|
|
|
|
namespace ircd::ios
|
|
|
|
{
|
2021-12-22 00:07:04 +01:00
|
|
|
extern asio::executor user, main;
|
|
|
|
extern std::optional<asio::io_context::strand> primary;
|
|
|
|
|
|
|
|
#if BOOST_VERSION >= 107000 && BOOST_VERSION < 107400
|
2020-02-27 19:11:59 +01:00
|
|
|
asio::executor &get() noexcept;
|
|
|
|
#else
|
|
|
|
asio::io_context &get() noexcept;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
// The following IRCd headers are not included in the main stdinc.h list of
|
|
|
|
// includes because they require boost directly or symbols which we cannot
|
|
|
|
// forward declare. You should include this in your definition file if you
|
|
|
|
// need these low-level interfaces.
|
2017-09-21 04:31:54 +02:00
|
|
|
|
2020-02-26 20:33:15 +01:00
|
|
|
// Context system headers depending on boost.
|
2017-09-21 04:31:54 +02:00
|
|
|
#include <ircd/ctx/continuation.h>
|
2020-02-26 20:33:15 +01:00
|
|
|
|
|
|
|
// Network system headers depending on boost.
|
2017-11-01 23:51:24 +01:00
|
|
|
#include <ircd/net/asio.h>
|
2019-09-26 05:30:26 +02:00
|
|
|
|
2021-12-22 00:07:04 +01:00
|
|
|
#if BOOST_VERSION >= 107000 && BOOST_VERSION < 107400
|
2020-02-27 19:11:59 +01:00
|
|
|
inline boost::asio::executor &
|
|
|
|
ircd::ios::get()
|
|
|
|
noexcept
|
|
|
|
{
|
|
|
|
assert(bool(main));
|
|
|
|
return main;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
inline boost::asio::io_context &
|
|
|
|
ircd::ios::get()
|
|
|
|
noexcept
|
|
|
|
{
|
2020-11-03 20:30:15 +01:00
|
|
|
auto &context(mutable_cast(main.context()));
|
2020-02-27 19:11:59 +01:00
|
|
|
return static_cast<asio::io_context &>(context);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2019-09-26 05:30:26 +02:00
|
|
|
#endif HAVE_IRCD_ASIO_H
|