11 #include <type_traits> 15 #include <hilti/rt/any.h> 16 #include <hilti/rt/autogen/config.h> 17 #include <hilti/rt/exception.h> 18 #include <hilti/rt/types/reference.h> 19 #include <hilti/rt/util.h> 24 extern "C" void __fiber_run_trampoline(
void* args);
27 extern "C" void __fiber_switch_trampoline(
void* args);
37 using Handle = detail::Fiber;
48 std::unique_ptr<detail::Fiber>
main;
60 std::vector<std::unique_ptr<Fiber>>
cache;
82 std::pair<char*, char*> activeRegion()
const;
88 std::pair<char*, char*> allocatedRegion()
const;
95 size_t activeSize()
const {
return static_cast<size_t>(activeRegion().second - activeRegion().first); }
98 size_t allocatedSize()
const {
return static_cast<size_t>(allocatedRegion().second - allocatedRegion().first); }
101 size_t liveRemainingSize()
const;
110 void restore()
const;
113 const ::Fiber* _fiber;
114 void* _buffer =
nullptr;
118 inline std::ostream& operator<<(std::ostream& out,
const StackBuffer& s) {
128 : _f(std::move(f)), _invoke([](
const hilti::rt::any& f,
resumable::Handle* h) -> hilti::rt::any {
129 return hilti::rt::any_cast<F>(f)(h);
172 _exception =
nullptr;
173 _function = std::move(f);
187 bool isMain()
const {
return _type == Type::Main; }
192 case State::Yielded:
return false;
194 case State::Aborting:
195 case State::Finished:
205 auto&& result() {
return std::move(_result); }
206 std::exception_ptr exception()
const {
return _exception; }
208 std::string tag()
const;
210 static std::unique_ptr<Fiber> create();
211 static void destroy(std::unique_ptr<Fiber> f);
212 static void primeCache();
220 uint64_t initialized;
226 friend void ::__fiber_run_trampoline(
void* argsp);
227 friend void ::__fiber_switch_trampoline(
void* argsp);
229 enum class State { Init, Running, Aborting, Yielded, Idle, Finished };
231 void _yield(
const char* tag);
232 void _activate(
const char* tag);
235 static void _startSwitchFiber(
const char* tag,
detail::Fiber* to);
238 static void _finishSwitchFiber(
const char* tag);
244 State _state{State::Init};
245 std::optional<Callback> _function;
246 std::optional<hilti::rt::any> _result;
247 std::exception_ptr _exception;
250 std::unique_ptr<::Fiber> _fiber;
253 Fiber* _caller =
nullptr;
258 #ifdef HILTI_HAVE_ASAN 261 const void* stack =
nullptr;
262 size_t stack_size = 0;
263 void* fake_stack =
nullptr;
269 inline static uint64_t _total_fibers;
270 inline static uint64_t _current_fibers;
271 inline static uint64_t _cached_fibers;
272 inline static uint64_t _max_fibers;
273 inline static uint64_t _initialized;
276 std::ostream& operator<<(std::ostream& out,
const Fiber& fiber);
286 extern void checkStack();
303 template<typename Function, typename = std::enable_if_t<std::is_invocable<Function, resumable::Handle*>::value>>
305 _fiber->init(std::move(f));
316 detail::Fiber::destroy(std::move(_fiber));
335 bool hasResult()
const {
return _done && _result.has_value(); }
341 template<
typename Result>
343 assert(static_cast<bool>(_result));
345 if constexpr ( std::is_same<Result, void>::value )
349 return hilti::rt::any_cast<
const Result&>(*_result);
350 }
catch (
const hilti::rt::bad_any_cast& ) {
351 throw InvalidArgument(
"mismatch in result type");
357 explicit operator bool()
const {
return _done; }
362 void checkFiber(
const char*
location)
const {
364 throw std::logic_error(std::string(
"fiber not set in ") + location);
367 std::unique_ptr<detail::Fiber> _fiber;
369 std::optional<hilti::rt::any> _result;
372 namespace resumable::detail {
378 static_assert(! std::is_reference<T>::value,
"copyArg() does not accept references other than ValueReference<T>.");
404 template<
typename Function>
void init()
Definition: init.cc:19
std::shared_ptr< T > asSharedPtr() const
Definition: reference.h:121
std::unique_ptr<::Fiber > shared_stack
Definition: fiber.h:57
size_t activeSize() const
Definition: fiber.h:95
StackBuffer(const ::Fiber *fiber)
Definition: fiber.h:72
Type
Definition: fiber.h:154
void cannot_be_reached() __attribute__((noreturn))
Definition: util.cc:52
Definition: function.h:44
void run()
Definition: fiber.cc:552
const auto & stackBuffer() const
Definition: fiber.h:180
std::unique_ptr< detail::Fiber > main
Definition: fiber.h:48
auto type()
Definition: fiber.h:177
std::pair< char *, char * > activeRegion() const
Definition: fiber.cc:253
size_t allocatedSize() const
Definition: fiber.h:98
Definition: reference.h:47
std::unique_ptr< detail::Fiber > switch_trampoline
Definition: fiber.h:51
std::vector< std::unique_ptr< Fiber > > cache
Definition: fiber.h:60
resumable::Handle * handle()
Definition: fiber.h:329
Definition: location.h:94
bool hasResult() const
Definition: fiber.h:335
std::string fmt(const char *fmt, const Args &... args)
Definition: fmt.h:13
Resumable(Function f)
Definition: fiber.h:304