From ec0153c4dabc0469775279c2262bb544867d35f1 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 5 May 2018 21:20:25 -0700 Subject: [PATCH] ircd::ctx: Split into internal header. --- ircd/ctx.cc | 67 +---------------------------------------------------- ircd/ctx.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 66 deletions(-) create mode 100644 ircd/ctx.h diff --git a/ircd/ctx.cc b/ircd/ctx.cc index 6174d76a3..ca2455686 100644 --- a/ircd/ctx.cc +++ b/ircd/ctx.cc @@ -11,53 +11,7 @@ #include #include - -/// Internal context implementation -/// -struct ircd::ctx::ctx -:instance_list -{ - using error_code = boost::system::error_code; - - static uint64_t id_ctr; // monotonic - - uint64_t id; // Unique runtime ID - const char *name; // User given name (optional) - context::flags flags; // User given flags - boost::asio::io_service::strand strand; // mutex/serializer - boost::asio::steady_timer alarm; // acting semaphore (64B) - boost::asio::yield_context *yc; // boost interface - uintptr_t stack_base; // assigned when spawned - size_t stack_max; // User given stack size - int64_t notes; // norm: 0 = asleep; 1 = awake; inc by others; dec by self - continuation *cont; // valid when asleep; invalid when awake - ctx *adjoindre; // context waiting for this to join() - microseconds awake; // monotonic counter - list::node node; // node for ctx::list - - bool started() const { return stack_base != 0; } - bool finished() const { return started() && yc == nullptr; } - - bool interruption_point(std::nothrow_t); // Check for interrupt (and clear flag) - void interruption_point(); // throws interrupted - - bool wait(); // yield context to ios queue (returns on this resume) - void jump(); // jump to context directly (returns on your resume) - void wake(); // jump to context by queueing with ios (use note()) - bool note(); // properly request wake() - - void operator()(boost::asio::yield_context, const std::function) noexcept; - - ctx(const char *const &name = "", - const size_t &stack_max = DEFAULT_STACK_SIZE, - const context::flags &flags = (context::flags)0, - boost::asio::io_service *const &ios = ircd::ios); - - ctx(ctx &&) = delete; - ctx(const ctx &) = delete; - ctx &operator=(ctx &&) = delete; - ctx &operator=(const ctx &) = delete; -}; +#include "ctx.h" /// Instance list linkage for the list of all ctx instances. template<> @@ -80,25 +34,6 @@ ircd::ctx::ctx::id_ctr 0 }; -ircd::ctx::ctx::ctx(const char *const &name, - const size_t &stack_max, - const context::flags &flags, - boost::asio::io_service *const &ios) -:id{++id_ctr} -,name{name} -,flags{flags} -,strand{*ios} -,alarm{*ios} -,yc{nullptr} -,stack_base{0} -,stack_max{stack_max} -,notes{1} -,cont{nullptr} -,adjoindre{nullptr} -,awake{0us} -{ -} - /// Base frame for a context. /// /// This function is the first thing executed on the new context's stack diff --git a/ircd/ctx.h b/ircd/ctx.h new file mode 100644 index 000000000..9f8702584 --- /dev/null +++ b/ircd/ctx.h @@ -0,0 +1,62 @@ +// Matrix Construct +// +// Copyright (C) Matrix Construct Developers, Authors & Contributors +// Copyright (C) 2016-2018 Jason Volk +// +// 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. + +/// Internal context implementation +/// +struct ircd::ctx::ctx +:instance_list +{ + using error_code = boost::system::error_code; + + static uint64_t id_ctr; // monotonic + + uint64_t id {++id_ctr}; // Unique runtime ID + const char *name {nullptr}; // User given name (optional) + context::flags flags {(context::flags)0}; // User given flags + boost::asio::io_service::strand strand; // mutex/serializer + boost::asio::steady_timer alarm; // acting semaphore (64B) + boost::asio::yield_context *yc {nullptr}; // boost interface + uintptr_t stack_base {0}; // assigned when spawned + size_t stack_max {0}; // User given stack size + int64_t notes {0}; // norm: 0 = asleep; 1 = awake; inc by others; dec by self + continuation *cont {nullptr}; // valid when asleep; invalid when awake + ctx *adjoindre {nullptr}; // context waiting for this to join() + microseconds awake {0}; // monotonic counter + list::node node; // node for ctx::list + + bool started() const { return stack_base != 0; } + bool finished() const { return started() && yc == nullptr; } + + bool interruption_point(std::nothrow_t); // Check for interrupt (and clear flag) + void interruption_point(); // throws interrupted + + bool wait(); // yield context to ios queue (returns on this resume) + void jump(); // jump to context directly (returns on your resume) + void wake(); // jump to context by queueing with ios (use note()) + bool note(); // properly request wake() + + void operator()(boost::asio::yield_context, const std::function) noexcept; + + ctx(const char *const &name = "", + const size_t &stack_max = DEFAULT_STACK_SIZE, + const context::flags &flags = (context::flags)0, + boost::asio::io_service *const &ios = ircd::ios) + :name{name} + ,flags{flags} + ,strand{*ios} + ,alarm{*ios} + ,stack_max{stack_max} + {} + + ctx(ctx &&) = delete; + ctx(const ctx &) = delete; + ctx &operator=(ctx &&) = delete; + ctx &operator=(const ctx &) = delete; +};