Ruby  2.1.10p492(2016-04-01revision54464)
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
cont.c File Reference
#include "ruby/ruby.h"
#include "internal.h"
#include "vm_core.h"
#include "gc.h"
#include "eval_intern.h"

Go to the source code of this file.

Data Structures

struct  rb_context_struct
 
struct  rb_fiber_struct
 

Macros

#define FIBER_USE_NATIVE   0
 
#define CAPTURE_JUST_VALID_VM_STACK   1
 
#define GetContPtr(obj, ptr)   TypedData_Get_Struct((obj), rb_context_t, &cont_data_type, (ptr))
 
#define GetFiberPtr(obj, ptr)
 
#define THREAD_MUST_BE_RUNNING(th)
 
#define STACK_PAD_SIZE   1024
 

Typedefs

typedef struct rb_context_struct rb_context_t
 
typedef struct rb_fiber_struct rb_fiber_t
 

Enumerations

enum  context_type { CONTINUATION_CONTEXT = 0, FIBER_CONTEXT = 1, ROOT_FIBER_CONTEXT = 2 }
 
enum  fiber_status { CREATED, RUNNING, TERMINATED }
 

Functions

 NOINLINE (static VALUE cont_capture(volatile int *stat))
 
static void cont_mark (void *ptr)
 
static void cont_free (void *ptr)
 
static size_t cont_memsize (const void *ptr)
 
static void fiber_mark (void *ptr)
 
static void fiber_link_join (rb_fiber_t *fib)
 
static void fiber_link_remove (rb_fiber_t *fib)
 
static void fiber_free (void *ptr)
 
static size_t fiber_memsize (const void *ptr)
 
VALUE rb_obj_is_fiber (VALUE obj)
 
static void cont_save_machine_stack (rb_thread_t *th, rb_context_t *cont)
 
static void cont_save_thread (rb_context_t *cont, rb_thread_t *th)
 
static void cont_init (rb_context_t *cont, rb_thread_t *th)
 
static rb_context_tcont_new (VALUE klass)
 
static VALUE cont_capture (volatile int *stat)
 
static void cont_restore_thread (rb_context_t *cont)
 
 NOINLINE (NORETURN(static void cont_restore_1(rb_context_t *)))
 
static void cont_restore_1 (rb_context_t *cont)
 
 NORETURN (NOINLINE(static void cont_restore_0(rb_context_t *, VALUE *)))
 
static void cont_restore_0 (rb_context_t *cont, VALUE *addr_in_prev_frame)
 
static VALUE rb_callcc (VALUE self)
 
static VALUE make_passing_arg (int argc, VALUE *argv)
 
void ruby_register_rollback_func_for_ensure (VALUE(*ensure_func)(ANYARGS), VALUE(*rollback_func)(ANYARGS))
 
static VALUE lookup_rollback_func (VALUE(*ensure_func)(ANYARGS))
 
static void rollback_ensure_stack (VALUE self, rb_ensure_list_t *current, rb_ensure_entry_t *target)
 
static VALUE rb_cont_call (int argc, VALUE *argv, VALUE contval)
 
static VALUE fiber_alloc (VALUE klass)
 
static rb_fiber_tfiber_t_alloc (VALUE fibval)
 
static VALUE fiber_init (VALUE fibval, VALUE proc)
 
static VALUE rb_fiber_init (VALUE fibval)
 
VALUE rb_fiber_new (VALUE(*func)(ANYARGS), VALUE obj)
 
static VALUE return_fiber (void)
 
VALUE rb_fiber_transfer (VALUE fib, int argc, VALUE *argv)
 
static void rb_fiber_terminate (rb_fiber_t *fib)
 
void rb_fiber_start (void)
 
static rb_fiber_troot_fiber_alloc (rb_thread_t *th)
 
VALUE rb_fiber_current (void)
 
static VALUE fiber_store (rb_fiber_t *next_fib)
 
static VALUE fiber_switch (VALUE fibval, int argc, VALUE *argv, int is_resume)
 
VALUE rb_fiber_resume (VALUE fibval, int argc, VALUE *argv)
 
VALUE rb_fiber_yield (int argc, VALUE *argv)
 
void rb_fiber_reset_root_local_storage (VALUE thval)
 
VALUE rb_fiber_alive_p (VALUE fibval)
 
static VALUE rb_fiber_m_resume (int argc, VALUE *argv, VALUE fib)
 
static VALUE rb_fiber_m_transfer (int argc, VALUE *argv, VALUE fibval)
 
static VALUE rb_fiber_s_yield (int argc, VALUE *argv, VALUE klass)
 
static VALUE rb_fiber_s_current (VALUE klass)
 
void Init_Cont (void)
 
RUBY_SYMBOL_EXPORT_BEGIN void ruby_Init_Continuation_body (void)
 
void ruby_Init_Fiber_as_Coroutine (void)
 

Variables

static const rb_data_type_t cont_data_type
 
static const rb_data_type_t fiber_data_type
 
static VALUE rb_cContinuation
 
static VALUE rb_cFiber
 
static VALUE rb_eFiberError
 

Macro Definition Documentation

◆ CAPTURE_JUST_VALID_VM_STACK

#define CAPTURE_JUST_VALID_VM_STACK   1

Definition at line 82 of file cont.c.

◆ FIBER_USE_NATIVE

#define FIBER_USE_NATIVE   0

Definition at line 68 of file cont.c.

Referenced by fiber_store().

◆ GetContPtr

#define GetContPtr (   obj,
  ptr 
)    TypedData_Get_Struct((obj), rb_context_t, &cont_data_type, (ptr))

Definition at line 165 of file cont.c.

Referenced by rb_cont_call().

◆ GetFiberPtr

#define GetFiberPtr (   obj,
  ptr 
)
Value:
do {\
TypedData_Get_Struct((obj), rb_fiber_t, &fiber_data_type, (ptr)); \
if (!(ptr)) rb_raise(rb_eFiberError, "uninitialized fiber"); \
} while (0)
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:1857
static const rb_data_type_t fiber_data_type
Definition: cont.c:160
static VALUE rb_eFiberError
Definition: cont.c:163

Definition at line 168 of file cont.c.

Referenced by cont_restore_thread(), fiber_link_join(), fiber_store(), fiber_switch(), rb_cont_call(), rb_fiber_alive_p(), rb_fiber_m_transfer(), rb_fiber_reset_root_local_storage(), rb_fiber_resume(), rb_fiber_start(), and return_fiber().

◆ STACK_PAD_SIZE

#define STACK_PAD_SIZE   1024

Referenced by cont_restore_0().

◆ THREAD_MUST_BE_RUNNING

#define THREAD_MUST_BE_RUNNING (   th)
Value:
do { \
if (!(th)->tag) rb_raise(rb_eThreadError, "not running thread"); \
} while (0)
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:1857
VALUE rb_eThreadError
Definition: eval.c:730

Definition at line 175 of file cont.c.

Referenced by cont_capture(), cont_new(), and fiber_t_alloc().

Typedef Documentation

◆ rb_context_t

◆ rb_fiber_t

typedef struct rb_fiber_struct rb_fiber_t

Enumeration Type Documentation

◆ context_type

Enumerator
CONTINUATION_CONTEXT 
FIBER_CONTEXT 
ROOT_FIBER_CONTEXT 

Definition at line 84 of file cont.c.

◆ fiber_status

Enumerator
CREATED 
RUNNING 
TERMINATED 

Definition at line 116 of file cont.c.

Function Documentation

◆ cont_capture()

static VALUE cont_capture ( volatile int *  stat)
static

◆ cont_free()

static void cont_free ( void *  ptr)
static

◆ cont_init()

static void cont_init ( rb_context_t cont,
rb_thread_t th 
)
static

◆ cont_mark()

static void cont_mark ( void *  ptr)
static

◆ cont_memsize()

static size_t cont_memsize ( const void *  ptr)
static

◆ cont_new()

static rb_context_t* cont_new ( VALUE  klass)
static

◆ cont_restore_0()

static void cont_restore_0 ( rb_context_t cont,
VALUE addr_in_prev_frame 
)
static

◆ cont_restore_1()

static void cont_restore_1 ( rb_context_t cont)
static

◆ cont_restore_thread()

static void cont_restore_thread ( rb_context_t cont)
static

◆ cont_save_machine_stack()

static void cont_save_machine_stack ( rb_thread_t th,
rb_context_t cont 
)
static

◆ cont_save_thread()

static void cont_save_thread ( rb_context_t cont,
rb_thread_t th 
)
static

◆ fiber_alloc()

static VALUE fiber_alloc ( VALUE  klass)
static

Definition at line 1148 of file cont.c.

References fiber_data_type, and TypedData_Wrap_Struct.

Referenced by Init_Cont(), rb_fiber_new(), and root_fiber_alloc().

◆ fiber_free()

static void fiber_free ( void *  ptr)
static

◆ fiber_init()

static VALUE fiber_init ( VALUE  fibval,
VALUE  proc 
)
static

◆ fiber_link_join()

static void fiber_link_join ( rb_fiber_t fib)
static

Definition at line 322 of file cont.c.

References GetFiberPtr, rb_fiber_struct::next_fiber, rb_fiber_struct::prev_fiber, and rb_fiber_current().

Referenced by fiber_init().

◆ fiber_link_remove()

static void fiber_link_remove ( rb_fiber_t fib)
static

Definition at line 336 of file cont.c.

References rb_fiber_struct::next_fiber, and rb_fiber_struct::prev_fiber.

Referenced by fiber_free().

◆ fiber_mark()

static void fiber_mark ( void *  ptr)
static

◆ fiber_memsize()

static size_t fiber_memsize ( const void *  ptr)
static

◆ fiber_store()

static VALUE fiber_store ( rb_fiber_t next_fib)
static

◆ fiber_switch()

static VALUE fiber_switch ( VALUE  fibval,
int  argc,
VALUE argv,
int  is_resume 
)
inlinestatic

◆ fiber_t_alloc()

static rb_fiber_t* fiber_t_alloc ( VALUE  fibval)
static

◆ Init_Cont()

void Init_Cont ( void  )

◆ lookup_rollback_func()

static VALUE lookup_rollback_func ( VALUE(*)(ANYARGS ensure_func)
inlinestatic

Definition at line 965 of file cont.c.

References GET_VM, Qundef, st_data_t, st_lookup(), and val.

Referenced by rollback_ensure_stack().

◆ make_passing_arg()

static VALUE make_passing_arg ( int  argc,
VALUE argv 
)
static

Definition at line 940 of file cont.c.

References argc, argv, Qnil, and rb_ary_new4.

Referenced by fiber_switch(), and rb_cont_call().

◆ NOINLINE() [1/2]

NOINLINE ( static VALUE   cont_capturevolatile int *stat)

◆ NOINLINE() [2/2]

NOINLINE ( NORETURN(static void cont_restore_1(rb_context_t *))  )

◆ NORETURN()

NORETURN ( NOINLINE(static void cont_restore_0(rb_context_t *, VALUE *))  )

◆ rb_callcc()

static VALUE rb_callcc ( VALUE  self)
static

Definition at line 926 of file cont.c.

References cont_capture(), rb_yield(), and val.

Referenced by ruby_Init_Continuation_body().

◆ rb_cont_call()

static VALUE rb_cont_call ( int  argc,
VALUE argv,
VALUE  contval 
)
static

◆ rb_fiber_alive_p()

VALUE rb_fiber_alive_p ( VALUE  fibval)

Definition at line 1533 of file cont.c.

References GetFiberPtr, Qfalse, Qtrue, rb_fiber_struct::status, and TERMINATED.

Referenced by get_next_values(), and ruby_Init_Fiber_as_Coroutine().

◆ rb_fiber_current()

VALUE rb_fiber_current ( void  )

◆ rb_fiber_init()

static VALUE rb_fiber_init ( VALUE  fibval)
static

Definition at line 1225 of file cont.c.

References fiber_init(), and rb_block_proc().

Referenced by Init_Cont().

◆ rb_fiber_m_resume()

static VALUE rb_fiber_m_resume ( int  argc,
VALUE argv,
VALUE  fib 
)
static

Definition at line 1556 of file cont.c.

References argc, argv, and rb_fiber_resume().

Referenced by Init_Cont().

◆ rb_fiber_m_transfer()

static VALUE rb_fiber_m_transfer ( int  argc,
VALUE argv,
VALUE  fibval 
)
static

Definition at line 1607 of file cont.c.

References argc, argv, GetFiberPtr, rb_fiber_transfer(), and rb_fiber_struct::transferred.

Referenced by ruby_Init_Fiber_as_Coroutine().

◆ rb_fiber_new()

VALUE rb_fiber_new ( VALUE(*)(ANYARGS func,
VALUE  obj 
)

Definition at line 1231 of file cont.c.

References fiber_alloc(), fiber_init(), func, rb_cFiber, and rb_proc_new().

Referenced by next_init().

◆ rb_fiber_reset_root_local_storage()

void rb_fiber_reset_root_local_storage ( VALUE  thval)

◆ rb_fiber_resume()

VALUE rb_fiber_resume ( VALUE  fibval,
int  argc,
VALUE argv 
)

◆ rb_fiber_s_current()

static VALUE rb_fiber_s_current ( VALUE  klass)
static

Definition at line 1640 of file cont.c.

References rb_fiber_current().

Referenced by ruby_Init_Fiber_as_Coroutine().

◆ rb_fiber_s_yield()

static VALUE rb_fiber_s_yield ( int  argc,
VALUE argv,
VALUE  klass 
)
static

Definition at line 1626 of file cont.c.

References argc, argv, and rb_fiber_yield().

Referenced by Init_Cont().

◆ rb_fiber_start()

void rb_fiber_start ( void  )

◆ rb_fiber_terminate()

static void rb_fiber_terminate ( rb_fiber_t fib)
static

◆ rb_fiber_transfer()

VALUE rb_fiber_transfer ( VALUE  fib,
int  argc,
VALUE argv 
)

Definition at line 1483 of file cont.c.

References argc, argv, and fiber_switch().

Referenced by rb_fiber_m_transfer(), rb_fiber_terminate(), and rb_fiber_yield().

◆ rb_fiber_yield()

VALUE rb_fiber_yield ( int  argc,
VALUE argv 
)

Definition at line 1505 of file cont.c.

References argc, argv, rb_fiber_transfer(), and return_fiber().

Referenced by next_i(), next_ii(), and rb_fiber_s_yield().

◆ rb_obj_is_fiber()

VALUE rb_obj_is_fiber ( VALUE  obj)

Definition at line 376 of file cont.c.

References fiber_data_type, Qfalse, Qtrue, and rb_typeddata_is_kind_of().

Referenced by rb_objspace_call_finalizer().

◆ return_fiber()

static VALUE return_fiber ( void  )
static

◆ rollback_ensure_stack()

static void rollback_ensure_stack ( VALUE  self,
rb_ensure_list_t current,
rb_ensure_entry_t target 
)
inlinestatic

◆ root_fiber_alloc()

static rb_fiber_t* root_fiber_alloc ( rb_thread_t th)
static

◆ ruby_Init_Continuation_body()

RUBY_SYMBOL_EXPORT_BEGIN void ruby_Init_Continuation_body ( void  )

◆ ruby_Init_Fiber_as_Coroutine()

void ruby_Init_Fiber_as_Coroutine ( void  )

◆ ruby_register_rollback_func_for_ensure()

void ruby_register_rollback_func_for_ensure ( VALUE(*)(ANYARGS ensure_func,
VALUE(*)(ANYARGS rollback_func 
)

Definition at line 955 of file cont.c.

References GET_VM, NULL, st_data_t, st_init_numtable(), st_insert(), and UNLIKELY.

Referenced by Init_Hash().

Variable Documentation

◆ cont_data_type

static const rb_data_type_t cont_data_type
static
Initial value:
= {
"continuation",
}
#define RUBY_TYPED_FREE_IMMEDIATELY
Definition: ruby.h:1015
static void cont_free(void *ptr)
Definition: cont.c:227
static void cont_mark(void *ptr)
Definition: cont.c:180
static size_t cont_memsize(const void *ptr)
Definition: cont.c:282
#define NULL
Definition: _sdbm.c:102

Definition at line 160 of file cont.c.

Referenced by cont_new().

◆ fiber_data_type

static const rb_data_type_t fiber_data_type
static
Initial value:
= {
"fiber",
}
#define RUBY_TYPED_FREE_IMMEDIATELY
Definition: ruby.h:1015
static size_t fiber_memsize(const void *ptr)
Definition: cont.c:360
static void fiber_mark(void *ptr)
Definition: cont.c:310
static void fiber_free(void *ptr)
Definition: cont.c:343
#define NULL
Definition: _sdbm.c:102

Definition at line 160 of file cont.c.

Referenced by fiber_alloc(), and rb_obj_is_fiber().

◆ rb_cContinuation

VALUE rb_cContinuation
static

Definition at line 161 of file cont.c.

Referenced by cont_capture(), and ruby_Init_Continuation_body().

◆ rb_cFiber

VALUE rb_cFiber
static

Definition at line 162 of file cont.c.

Referenced by Init_Cont(), rb_fiber_new(), root_fiber_alloc(), and ruby_Init_Fiber_as_Coroutine().

◆ rb_eFiberError

VALUE rb_eFiberError
static

Definition at line 163 of file cont.c.

Referenced by fiber_switch(), Init_Cont(), rb_fiber_resume(), and return_fiber().