2018-10-17 14:12:10 +02: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.
|
|
|
|
|
|
|
|
#include <ircd/asio.h>
|
|
|
|
|
2018-11-02 04:14:00 +01:00
|
|
|
/// Boost version indicator for compiled header files.
|
|
|
|
decltype(ircd::boost_version)
|
|
|
|
ircd::boost_version
|
|
|
|
{
|
|
|
|
BOOST_VERSION / 100000,
|
|
|
|
BOOST_VERSION / 100 % 1000,
|
|
|
|
BOOST_VERSION % 100,
|
|
|
|
};
|
|
|
|
|
|
|
|
char ircd_boost_version_str_buf[32];
|
|
|
|
decltype(ircd::boost_version_str)
|
|
|
|
ircd::boost_version_str
|
|
|
|
(
|
|
|
|
ircd_boost_version_str_buf,
|
|
|
|
::snprintf(ircd_boost_version_str_buf, sizeof(ircd_boost_version_str_buf),
|
|
|
|
"%u.%u.%u",
|
|
|
|
boost_version[0],
|
|
|
|
boost_version[1],
|
|
|
|
boost_version[2])
|
|
|
|
);
|
|
|
|
|
2018-10-17 14:12:10 +02:00
|
|
|
/// Record of the ID of the thread static initialization took place on.
|
|
|
|
decltype(ircd::ios::static_thread_id)
|
|
|
|
ircd::ios::static_thread_id
|
|
|
|
{
|
|
|
|
std::this_thread::get_id()
|
|
|
|
};
|
|
|
|
|
|
|
|
/// "main" thread for IRCd; the one the main context landed on.
|
|
|
|
decltype(ircd::ios::main_thread_id)
|
|
|
|
ircd::ios::main_thread_id;
|
|
|
|
|
|
|
|
decltype(ircd::ios::user)
|
|
|
|
ircd::ios::user;
|
|
|
|
|
|
|
|
void
|
|
|
|
ircd::ios::init(asio::io_context &user)
|
|
|
|
{
|
|
|
|
// Sample the ID of this thread. Since this is the first transfer of
|
|
|
|
// control to libircd after static initialization we have nothing to
|
|
|
|
// consider a main thread yet. We need something set for many assertions
|
|
|
|
// to pass until ircd::main() is entered which will reset this to where
|
|
|
|
// ios.run() is really running.
|
|
|
|
main_thread_id = std::this_thread::get_id();
|
|
|
|
|
|
|
|
// Set a reference to the user's ios_service
|
|
|
|
ios::user = &user;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ircd::ios::post(std::function<void ()> function)
|
|
|
|
{
|
|
|
|
boost::asio::post(get(), std::move(function));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ircd::ios::dispatch(std::function<void ()> function)
|
|
|
|
{
|
|
|
|
boost::asio::dispatch(get(), std::move(function));
|
|
|
|
}
|
|
|
|
|
2019-03-27 00:53:31 +01:00
|
|
|
void
|
|
|
|
ircd::ios::post(descriptor &descriptor,
|
|
|
|
std::function<void ()> function)
|
|
|
|
{
|
|
|
|
boost::asio::post(get(), handle(descriptor, std::move(function)));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ircd::ios::dispatch(descriptor &descriptor,
|
|
|
|
std::function<void ()> function)
|
|
|
|
{
|
|
|
|
boost::asio::dispatch(get(), handle(descriptor, std::move(function)));
|
|
|
|
}
|
|
|
|
|
2018-10-17 14:12:10 +02:00
|
|
|
boost::asio::io_context &
|
|
|
|
ircd::ios::get()
|
|
|
|
{
|
|
|
|
assert(user);
|
|
|
|
return *user;
|
|
|
|
}
|
2018-12-28 22:05:03 +01:00
|
|
|
|
|
|
|
bool
|
|
|
|
ircd::ios::available()
|
|
|
|
{
|
|
|
|
return bool(user);
|
|
|
|
}
|
2019-03-27 00:53:31 +01:00
|
|
|
|
|
|
|
//
|
|
|
|
// descriptor
|
|
|
|
//
|
|
|
|
|
|
|
|
template<>
|
|
|
|
decltype(ircd::util::instance_list<ircd::ios::descriptor>::list)
|
|
|
|
ircd::util::instance_list<ircd::ios::descriptor>::list
|
|
|
|
{};
|
|
|
|
|
|
|
|
decltype(ircd::ios::descriptor::ids)
|
|
|
|
ircd::ios::descriptor::ids;
|
|
|
|
|
|
|
|
//
|
|
|
|
// descriptor::descriptor
|
|
|
|
//
|
|
|
|
|
|
|
|
ircd::ios::descriptor::descriptor(const string_view &name)
|
|
|
|
:name{name}
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ircd::ios::descriptor::~descriptor()
|
|
|
|
noexcept
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// handler
|
|
|
|
//
|
|
|
|
|
|
|
|
bool
|
|
|
|
ircd::ios::handler::fault(handler *const &handler)
|
|
|
|
{
|
|
|
|
assert(handler && handler->descriptor);
|
|
|
|
auto &descriptor(*handler->descriptor);
|
|
|
|
++descriptor.faults;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ircd::ios::handler::leave(handler *const &handler)
|
|
|
|
{
|
|
|
|
assert(handler && handler->descriptor);
|
|
|
|
auto &descriptor(*handler->descriptor);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ircd::ios::handler::enter(handler *const &handler)
|
|
|
|
{
|
|
|
|
assert(handler && handler->descriptor);
|
|
|
|
auto &descriptor(*handler->descriptor);
|
|
|
|
++descriptor.calls;
|
|
|
|
}
|