#include "ruby/ruby.h"
#include "vm_core.h"
#include "gc.h"
#include "eval_intern.h"
Go to the source code of this file.
#define GetContPtr | ( | obj, | ||
ptr | ||||
) | TypedData_Get_Struct(obj, rb_context_t, &cont_data_type, ptr) |
Definition at line 66 of file cont.c.
Referenced by rb_cont_call().
#define GetFiberPtr | ( | obj, | ||
ptr | ||||
) |
do {\ TypedData_Get_Struct(obj, rb_fiber_t, &fiber_data_type, ptr); \ if (!ptr) rb_raise(rb_eFiberError, "uninitialized fiber"); \ } while(0)
Definition at line 69 of file cont.c.
Referenced by cont_restore_1(), fiber_link_join(), fiber_store(), fiber_switch(), rb_cont_call(), rb_fiber_alive_p(), rb_fiber_resume(), rb_fiber_start(), and return_fiber().
#define STACK_PAD_SIZE 1024 |
Referenced by cont_restore_0().
#define THREAD_MUST_BE_RUNNING | ( | th | ) |
do { \ if (!th->tag) rb_raise(rb_eThreadError, "not running thread"); \ } while (0)
Definition at line 77 of file cont.c.
Referenced by cont_capture(), cont_new(), and fiber_t_alloc().
typedef struct rb_context_struct rb_context_t |
typedef struct rb_fiber_struct rb_fiber_t |
enum context_type |
enum fiber_status |
static VALUE cont_capture | ( | volatile int * | stat | ) | [static] |
Definition at line 307 of file cont.c.
References ALLOC_N, rb_context_struct::argc, rb_thread_struct::cfp, rb_fiber_struct::cont, cont_new(), cont_save_machine_stack(), GET_THREAD, rb_context_struct::jmpbuf, rb_thread_struct::mark_stack_len, MEMCPY, rb_cContinuation, rb_exc_raise(), rb_vm_stack_to_heap(), ruby_setjmp, rb_context_struct::saved_thread, rb_context_struct::self, rb_control_frame_t::sp, rb_thread_struct::stack, rb_thread_struct::stack_size, THREAD_MUST_BE_RUNNING, rb_context_struct::value, rb_context_struct::vm_stack, rb_context_struct::vm_stack_clen, and rb_context_struct::vm_stack_slen.
Referenced by rb_callcc().
static void cont_free | ( | void * | ptr | ) | [static] |
Definition at line 115 of file cont.c.
References rb_fiber_struct::cont, rb_context_struct::machine_stack, RUBY_FREE_ENTER, RUBY_FREE_LEAVE, RUBY_FREE_UNLESS_NULL, ruby_xfree(), rb_context_struct::saved_thread, rb_thread_struct::stack, and rb_context_struct::vm_stack.
Referenced by fiber_free().
static void cont_init | ( | rb_context_t * | cont, | |
rb_thread_t * | th | |||
) | [static] |
Definition at line 283 of file cont.c.
References rb_thread_struct::local_storage, and rb_context_struct::saved_thread.
Referenced by cont_new(), and fiber_t_alloc().
static void cont_mark | ( | void * | ptr | ) | [static] |
Definition at line 82 of file cont.c.
References rb_fiber_struct::cont, rb_context_struct::machine_stack, rb_context_struct::machine_stack_size, rb_gc_mark(), rb_gc_mark_locations, rb_thread_mark(), RUBY_MARK_ENTER, RUBY_MARK_LEAVE, rb_context_struct::saved_thread, rb_thread_struct::stack_size, rb_context_struct::value, rb_context_struct::vm_stack, rb_context_struct::vm_stack_clen, and rb_context_struct::vm_stack_slen.
Referenced by fiber_mark().
static size_t cont_memsize | ( | const void * | ptr | ) | [static] |
Definition at line 134 of file cont.c.
References rb_fiber_struct::cont, rb_context_struct::machine_stack, rb_context_struct::machine_stack_size, rb_context_struct::saved_thread, size, rb_thread_struct::stack_size, rb_context_struct::vm_stack, rb_context_struct::vm_stack_clen, and rb_context_struct::vm_stack_slen.
Referenced by fiber_memsize().
static rb_context_t* cont_new | ( | VALUE | klass | ) | [static] |
Definition at line 291 of file cont.c.
References rb_fiber_struct::cont, cont_init(), GET_THREAD, rb_context_struct::self, THREAD_MUST_BE_RUNNING, and TypedData_Make_Struct.
Referenced by cont_capture().
static void cont_restore_0 | ( | rb_context_t * | cont, | |
VALUE * | addr_in_prev_frame | |||
) | [static] |
Definition at line 459 of file cont.c.
References ALLOCA_N, cont_restore_1(), rb_context_struct::machine_stack_size, rb_context_struct::machine_stack_src, and STACK_PAD_SIZE.
Referenced by fiber_switch(), and rb_cont_call().
static void cont_restore_1 | ( | rb_context_t * | cont | ) | [static] |
Definition at line 351 of file cont.c.
References buf, rb_thread_struct::cfp, rb_fiber_struct::cont, CONTINUATION_CONTEXT, rb_thread_struct::errinfo, rb_thread_struct::fiber, rb_thread_struct::first_proc, GET_THREAD, GetFiberPtr, rb_context_struct::jmpbuf, rb_thread_struct::local_storage, rb_context_struct::machine_stack, rb_context_struct::machine_stack_size, rb_context_struct::machine_stack_src, MEMCPY, rb_thread_struct::protect_tag, rb_thread_struct::raised_flag, rb_thread_struct::root_fiber, ruby_longjmp, rb_thread_struct::safe_level, rb_context_struct::saved_thread, rb_context_struct::self, rb_thread_struct::stack, rb_thread_struct::stack_size, rb_thread_struct::state, rb_thread_struct::status, rb_vm_tag::tag, rb_thread_struct::tag, rb_context_struct::type, rb_context_struct::vm_stack, rb_context_struct::vm_stack_clen, and rb_context_struct::vm_stack_slen.
Referenced by cont_restore_0().
static void cont_save_machine_stack | ( | rb_thread_t * | th, | |
rb_context_t * | cont | |||
) | [static] |
Definition at line 228 of file cont.c.
References ALLOC_N, rb_context_struct::machine_stack, rb_thread_struct::machine_stack_end, rb_context_struct::machine_stack_size, rb_context_struct::machine_stack_src, rb_thread_struct::machine_stack_start, MEMCPY, REALLOC_N, rb_context_struct::saved_thread, SET_MACHINE_STACK_END, and size.
Referenced by cont_capture(), and fiber_store().
Definition at line 717 of file cont.c.
References TypedData_Wrap_Struct.
Referenced by Init_Cont(), rb_fiber_new(), and root_fiber_alloc().
static void fiber_free | ( | void * | ptr | ) | [static] |
Definition at line 195 of file cont.c.
References rb_fiber_struct::cont, cont_free(), fiber_link_remove(), rb_thread_struct::local_storage, ROOT_FIBER_CONTEXT, RUBY_FREE_ENTER, RUBY_FREE_LEAVE, rb_context_struct::saved_thread, st_free_table(), and rb_context_struct::type.
Definition at line 743 of file cont.c.
References ALLOC_N, rb_control_frame_t::block_iseq, rb_control_frame_t::bp, rb_thread_struct::cfp, rb_fiber_struct::cont, rb_control_frame_t::dfp, fiber_link_join(), fiber_t_alloc(), rb_thread_struct::first_proc, rb_control_frame_t::flag, rb_control_frame_t::iseq, rb_context_struct::jmpbuf, rb_control_frame_t::lfp, rb_thread_struct::local_storage, rb_control_frame_t::me, MEMCPY, rb_control_frame_t::pc, rb_control_frame_t::proc, rb_thread_struct::root_jmpbuf, rb_context_struct::saved_thread, rb_control_frame_t::self, rb_control_frame_t::sp, st_init_numtable(), rb_thread_struct::stack, rb_thread_struct::stack_size, rb_thread_struct::tag, and rb_context_struct::vm_stack.
Referenced by rb_fiber_init(), and rb_fiber_new().
static void fiber_link_join | ( | rb_fiber_t * | fib | ) | [static] |
Definition at line 174 of file cont.c.
References GetFiberPtr, rb_fiber_struct::next_fiber, rb_fiber_struct::prev_fiber, and rb_fiber_current().
Referenced by fiber_init().
static void fiber_link_remove | ( | rb_fiber_t * | fib | ) | [static] |
Definition at line 188 of file cont.c.
References rb_fiber_struct::next_fiber, and rb_fiber_struct::prev_fiber.
Referenced by fiber_free().
static void fiber_mark | ( | void * | ptr | ) | [static] |
Definition at line 162 of file cont.c.
References rb_fiber_struct::cont, cont_mark(), rb_fiber_struct::prev, rb_gc_mark(), RUBY_MARK_ENTER, and RUBY_MARK_LEAVE.
static size_t fiber_memsize | ( | const void * | ptr | ) | [static] |
Definition at line 213 of file cont.c.
References rb_fiber_struct::cont, cont_memsize(), rb_thread_struct::local_storage, ROOT_FIBER_CONTEXT, rb_context_struct::saved_thread, size, st_memsize(), and rb_context_struct::type.
static VALUE fiber_store | ( | rb_fiber_t * | next_fib | ) | [static] |
Definition at line 902 of file cont.c.
References rb_context_struct::argc, rb_fiber_struct::cont, cont_save_machine_stack(), rb_thread_struct::fiber, GET_THREAD, GetFiberPtr, rb_context_struct::jmpbuf, rb_exc_raise(), rb_thread_struct::root_fiber, root_fiber_alloc(), ruby_setjmp, rb_context_struct::saved_thread, rb_context_struct::self, and rb_context_struct::value.
Referenced by fiber_switch().
Definition at line 931 of file cont.c.
References rb_context_struct::argc, rb_fiber_struct::cont, cont_restore_0(), rb_thread_struct::fiber, fiber_store(), GET_THREAD, GetFiberPtr, make_passing_arg(), NIL_P, rb_fiber_struct::prev, rb_thread_struct::protect_tag, Qundef, rb_bug(), rb_eFiberError, rb_exc_new2(), rb_exc_raise(), rb_fiber_current(), rb_raise(), rb_thread_struct::root_fiber, RUBY_VM_CHECK_INTS, rb_context_struct::saved_thread, rb_thread_struct::self, rb_fiber_struct::status, TERMINATED, and rb_context_struct::value.
Referenced by rb_fiber_resume(), and rb_fiber_transfer().
static rb_fiber_t* fiber_t_alloc | ( | VALUE | fibval | ) | [static] |
Definition at line 723 of file cont.c.
References ALLOC, rb_fiber_struct::cont, cont_init(), DATA_PTR, GET_THREAD, rb_fiber_struct::prev, rb_context_struct::self, rb_fiber_struct::status, THREAD_MUST_BE_RUNNING, and rb_context_struct::type.
Referenced by fiber_init(), and root_fiber_alloc().
void Init_Cont | ( | void | ) |
Definition at line 1112 of file cont.c.
References fiber_alloc(), rb_cFiber, rb_cObject, rb_define_alloc_func(), rb_define_class(), rb_define_method(), rb_define_singleton_method(), rb_eFiberError, rb_eStandardError, rb_fiber_init(), rb_fiber_m_resume(), and rb_fiber_s_yield().
Definition at line 586 of file cont.c.
References rb_ary_new4().
Referenced by fiber_switch(), and rb_cont_call().
NOINLINE | ( | NORETURN(static void cont_restore_1(rb_context_t *)) | ) |
NOINLINE | ( | static VALUE | cont_capturevolatile int *stat | ) |
NORETURN | ( | NOINLINE(static void cont_restore_0(rb_context_t *, VALUE *)) | ) |
Definition at line 572 of file cont.c.
References cont_capture(), and rb_yield().
Referenced by ruby_Init_Continuation_body().
Definition at line 615 of file cont.c.
References rb_context_struct::argc, cont_restore_0(), rb_thread_struct::fiber, GET_THREAD, GetContPtr, GetFiberPtr, make_passing_arg(), rb_thread_struct::protect_tag, rb_eRuntimeError, rb_raise(), rb_context_struct::saved_thread, rb_thread_struct::self, and rb_context_struct::value.
Referenced by ruby_Init_Continuation_body().
Definition at line 1016 of file cont.c.
References GetFiberPtr, Qtrue, rb_fiber_struct::status, and TERMINATED.
Referenced by get_next_values(), and ruby_Init_Fiber_as_Coroutine().
VALUE rb_fiber_current | ( | void | ) |
Definition at line 890 of file cont.c.
References rb_fiber_struct::cont, rb_thread_struct::fiber, GET_THREAD, rb_thread_struct::root_fiber, root_fiber_alloc(), and rb_context_struct::self.
Referenced by fiber_link_join(), fiber_switch(), get_next_values(), next_init(), rb_fiber_s_current(), and return_fiber().
Definition at line 787 of file cont.c.
References fiber_init(), and rb_block_proc().
Referenced by Init_Cont().
Definition at line 1061 of file cont.c.
References rb_fiber_transfer().
Referenced by ruby_Init_Fiber_as_Coroutine().
Definition at line 793 of file cont.c.
References fiber_alloc(), fiber_init(), func, rb_cFiber, and rb_proc_new().
Referenced by next_init().
Definition at line 989 of file cont.c.
References fiber_switch(), GetFiberPtr, rb_fiber_struct::prev, Qnil, rb_eFiberError, and rb_raise().
Referenced by get_next_values(), and rb_fiber_m_resume().
Definition at line 1091 of file cont.c.
References rb_fiber_current().
Referenced by ruby_Init_Fiber_as_Coroutine().
void rb_fiber_start | ( | void | ) |
Definition at line 833 of file cont.c.
References rb_context_struct::argc, argc, argv, rb_proc_t::block, rb_fiber_struct::cont, rb_thread_struct::errinfo, EXEC_TAG, rb_thread_struct::fiber, rb_thread_struct::first_proc, GET_THREAD, GetFiberPtr, GetProcPtr, rb_block_struct::lfp, rb_thread_struct::local_lfp, rb_thread_struct::local_svar, RARRAY_PTR, rb_bug(), rb_fiber_terminate(), rb_vm_invoke_proc(), rb_vm_make_jump_tag_but_local_jump(), RUBY_VM_SET_INTERRUPT, rb_context_struct::saved_thread, rb_block_struct::self, rb_fiber_struct::status, TAG_RAISE, TH_POP_TAG, TH_PUSH_TAG, rb_thread_struct::thrown_errinfo, and rb_context_struct::value.
static void rb_fiber_terminate | ( | rb_fiber_t * | fib | ) | [static] |
Definition at line 825 of file cont.c.
References rb_fiber_struct::cont, rb_fiber_transfer(), return_fiber(), rb_fiber_struct::status, and rb_context_struct::value.
Referenced by rb_fiber_start().
Definition at line 983 of file cont.c.
References fiber_switch().
Referenced by rb_fiber_m_transfer(), rb_fiber_terminate(), and rb_fiber_yield().
Definition at line 1002 of file cont.c.
References rb_fiber_transfer(), and return_fiber().
Referenced by next_i(), next_ii(), and rb_fiber_s_yield().
void rb_thread_mark | ( | rb_thread_t * | th | ) |
Referenced by cont_mark().
void rb_vm_stack_to_heap | ( | rb_thread_t * | th | ) |
Definition at line 442 of file vm.c.
References rb_thread_struct::cfp, rb_vm_get_ruby_level_next_cfp(), rb_vm_make_env_object(), and RUBY_VM_PREVIOUS_CONTROL_FRAME.
Referenced by cont_capture().
static VALUE return_fiber | ( | void | ) | [static] |
Definition at line 799 of file cont.c.
References GET_THREAD, GetFiberPtr, rb_fiber_struct::prev, Qnil, rb_eFiberError, rb_fiber_current(), rb_raise(), and rb_thread_struct::root_fiber.
Referenced by rb_fiber_terminate(), and rb_fiber_yield().
static rb_fiber_t* root_fiber_alloc | ( | rb_thread_t * | th | ) | [static] |
Definition at line 877 of file cont.c.
References rb_fiber_struct::cont, fiber_alloc(), fiber_t_alloc(), rb_fiber_struct::next_fiber, rb_fiber_struct::prev_fiber, rb_cFiber, and rb_context_struct::type.
Referenced by fiber_store(), and rb_fiber_current().
void ruby_Init_Continuation_body | ( | void | ) |
Definition at line 1123 of file cont.c.
References CLASS_OF, rb_callcc(), rb_cContinuation, rb_cObject, rb_cont_call(), rb_define_class(), rb_define_global_function(), rb_define_method(), rb_undef_alloc_func(), and rb_undef_method().
Referenced by Init_continuation().
void ruby_Init_Fiber_as_Coroutine | ( | void | ) |
Definition at line 1134 of file cont.c.
References rb_cFiber, rb_define_method(), rb_define_singleton_method(), rb_fiber_alive_p(), rb_fiber_m_transfer(), and rb_fiber_s_current().
Referenced by Init_fiber().
static const rb_data_type_t cont_data_type [static] |
static const rb_data_type_t fiber_data_type [static] |
VALUE rb_cContinuation [static] |
Definition at line 62 of file cont.c.
Referenced by cont_capture(), and ruby_Init_Continuation_body().
Definition at line 63 of file cont.c.
Referenced by Init_Cont(), rb_fiber_new(), root_fiber_alloc(), and ruby_Init_Fiber_as_Coroutine().
VALUE rb_eFiberError [static] |
Definition at line 64 of file cont.c.
Referenced by fiber_switch(), Init_Cont(), rb_fiber_resume(), and return_fiber().