libcopp 2.3.1
|
#include <libcopp/utils/config/libcopp_build_features.h>
#include <libcopp/utils/errno.h>
#include <libcopp/utils/std/explicit_declare.h>
#include <libcopp/coroutine/coroutine_context.h>
#include <libcopp/utils/config/stl_include_prefix.h>
#include <pthread.h>
#include <assert.h>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <libcopp/utils/config/stl_include_suffix.h>
Go to the source code of this file.
Data Structures | |
struct | libcopp_internal_api_set |
Namespaces | |
namespace | detail |
namespace | this_coroutine |
Functions | |
static void | detail::set_this_coroutine_context (coroutine_context_base *p) |
static coroutine_context_base * | detail::get_this_coroutine_context () |
static void | jump_to (fcontext::fcontext_t &to_fctx, LIBCOPP_EXPLICIT_UNUSED_ATTR stack_context &from_sctx, LIBCOPP_EXPLICIT_UNUSED_ATTR stack_context &to_sctx, libcopp_internal_api_set::jump_src_data_t &jump_transfer) LIBCOPP_MACRO_NOEXCEPT |
call platform jump to asm instruction | |
LIBCOPP_COPP_API coroutine_context * | this_coroutine::get_coroutine () LIBCOPP_MACRO_NOEXCEPT |
get current coroutine | |
LIBCOPP_COPP_API int | this_coroutine::yield (void **priv_data=nullptr) LIBCOPP_MACRO_NOEXCEPT |
yield current coroutine | |
Variables | |
static coroutine_context_base * | detail::gt_current_coroutine = nullptr |
|
inlinestatic |
call platform jump to asm instruction
to_fctx | jump to function context |
from_sctx | jump from stack context(only used for save segment stack) |
to_sctx | jump to stack context(only used for set segment stack) |
jump_transfer | jump data |
save from_co's fcontext and switch status we should use from_co in transfer_t, because it may not jump from jump_transfer.to_co
if we jump sequence is A->B->C->A.resume(), and if this call is A->B, then jump_src->from_co = C, jump_src->to_co = A, jump_transfer.from_co = A, jump_transfer.to_co = B and now we should save the callee of C and set the caller of A = C
if we jump sequence is A->B.yield()->A, and if this call is A->B, then jump_src->from_co = B, jump_src->to_co = nullptr, jump_transfer.from_co = A, jump_transfer.to_co = B and now we should save the callee of B and should change the caller of A
Definition at line 219 of file coroutine_context.cpp.
References coroutine_context::jump_src_data_t::from_co, coroutine_context::jump_src_data_t::priv_data, libcopp_internal_api_set::set_callee(), libcopp_internal_api_set::set_caller(), detail::set_this_coroutine_context(), and coroutine_context::jump_src_data_t::to_co.
Referenced by coroutine_context::start(), and coroutine_context::yield().