gnss-sim/3rdparty/boost/cobalt/run.hpp

62 lines
1.5 KiB
C++
Raw Normal View History

2024-12-24 16:15:51 +00:00
// Copyright (c) 2022 Klemens D. Morgenstern
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_COBALT_RUN_HPP
#define BOOST_COBALT_RUN_HPP
#include <boost/cobalt/spawn.hpp>
#include <boost/cobalt/task.hpp>
#include <boost/asio/use_future.hpp>
namespace boost::cobalt
{
template<typename T>
T run(task<T> t)
{
#if !defined(BOOST_COBALT_NO_PMR)
pmr::unsynchronized_pool_resource root_resource{this_thread::get_default_resource()};
struct reset_res
{
void operator()(pmr::memory_resource * res)
{
this_thread::set_default_resource(res);
}
};
std::unique_ptr<pmr::memory_resource, reset_res> pr{
boost::cobalt::this_thread::set_default_resource(&root_resource)};
#endif
std::future<T> f;
{
asio::io_context ctx{BOOST_ASIO_CONCURRENCY_HINT_1};
struct reset_exec
{
std::optional<executor> exec;
reset_exec()
{
if (this_thread::has_executor())
exec = this_thread::get_executor();
}
~reset_exec()
{
if (exec)
this_thread::set_executor(*exec);
}
};
reset_exec re;
this_thread::set_executor(ctx.get_executor());
f = spawn(ctx, std::move(t), asio::bind_executor(ctx.get_executor(), asio::use_future));
ctx.run();
}
return f.get();
}
}
#endif //BOOST_COBALT_RUN_HPP