Ruby  2.0.0p598(2014-11-13revision48408)
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)
 
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)
 
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

#define CAPTURE_JUST_VALID_VM_STACK   1

Definition at line 82 of file cont.c.

#define FIBER_USE_NATIVE   0

Definition at line 68 of file cont.c.

Referenced by fiber_store().

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

Definition at line 155 of file cont.c.

Referenced by rb_cont_call().

#define GetFiberPtr (   obj,
  ptr 
)
Value:
do {\
if (!(ptr)) rb_raise(rb_eFiberError, "uninitialized fiber"); \
} while (0)
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:1788
static const rb_data_type_t fiber_data_type
Definition: cont.c:150
static VALUE rb_eFiberError
Definition: cont.c:153
while(a->frac[0]/shift==0)
Definition: bigdecimal.c:5138
#define TypedData_Get_Struct(obj, type, data_type, sval)
static VALUE VALUE obj
Definition: tcltklib.c:3157
return ptr
Definition: tcltklib.c:784
if(RB_TYPE_P(r, T_FLOAT))
Definition: bigdecimal.c:1200

Definition at line 158 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().

#define STACK_PAD_SIZE   1024

Referenced by cont_restore_0().

#define THREAD_MUST_BE_RUNNING (   th)
Value:
do { \
if (!(th)->tag) rb_raise(rb_eThreadError, "not running thread"); \
} while (0)
static VALUE VALUE th
Definition: tcltklib.c:2947
param thread
Definition: tcltklib.c:4132
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:1788
while(a->frac[0]/shift==0)
Definition: bigdecimal.c:5138
if(RB_TYPE_P(r, T_FLOAT))
Definition: bigdecimal.c:1200
VALUE rb_eThreadError
Definition: eval.c:690

Definition at line 165 of file cont.c.

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

Typedef Documentation

typedef struct rb_fiber_struct rb_fiber_t

Enumeration Type Documentation

Enumerator
CONTINUATION_CONTEXT 
FIBER_CONTEXT 
ROOT_FIBER_CONTEXT 

Definition at line 84 of file cont.c.

Enumerator
CREATED 
RUNNING 
TERMINATED 

Definition at line 112 of file cont.c.

Function Documentation

static VALUE cont_capture ( volatile int stat)
static
static void cont_free ( void ptr)
static
static void cont_init ( rb_context_t cont,
rb_thread_t th 
)
static
static void cont_mark ( void ptr)
static
static size_t cont_memsize ( const void ptr)
static
static rb_context_t* cont_new ( VALUE  klass)
static
static void cont_restore_0 ( rb_context_t cont,
VALUE addr_in_prev_frame 
)
static
static void cont_restore_1 ( rb_context_t cont)
static
static void cont_restore_thread ( rb_context_t cont)
static
static void cont_save_machine_stack ( rb_thread_t th,
rb_context_t cont 
)
static
static void cont_save_thread ( rb_context_t cont,
rb_thread_t th 
)
static
static VALUE fiber_alloc ( VALUE  klass)
static

Definition at line 1037 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
static VALUE fiber_init ( VALUE  fibval,
VALUE  proc 
)
static
static void fiber_link_join ( rb_fiber_t fib)
static

Definition at line 310 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 324 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
static size_t fiber_memsize ( const void ptr)
static
static VALUE fiber_store ( rb_fiber_t next_fib)
static
static VALUE fiber_switch ( VALUE  fibval,
int  argc,
VALUE argv,
int  is_resume 
)
inlinestatic
static rb_fiber_t* fiber_t_alloc ( VALUE  fibval)
static
void Init_Cont ( void  )
static VALUE make_passing_arg ( int  argc,
VALUE argv 
)
static

Definition at line 905 of file cont.c.

References Qnil, and rb_ary_new4().

Referenced by fiber_switch(), and rb_cont_call().

NOINLINE ( static VALUE   cont_capturevolatile int *stat)
NOINLINE ( NORETURN(static void cont_restore_1(rb_context_t *))  )
NORETURN ( NOINLINE(static void cont_restore_0(rb_context_t *, VALUE *))  )
static VALUE rb_callcc ( VALUE  self)
static

Definition at line 891 of file cont.c.

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

Referenced by ruby_Init_Continuation_body().

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

Definition at line 1422 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().

VALUE rb_fiber_current ( void  )
static VALUE rb_fiber_init ( VALUE  fibval)
static

Definition at line 1114 of file cont.c.

References fiber_init(), and rb_block_proc().

Referenced by Init_Cont().

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

Definition at line 1445 of file cont.c.

References rb_fiber_resume().

Referenced by Init_Cont().

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

Definition at line 1496 of file cont.c.

References GetFiberPtr, rb_fiber_transfer(), and rb_fiber_struct::transfered.

Referenced by ruby_Init_Fiber_as_Coroutine().

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

Definition at line 1120 of file cont.c.

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

Referenced by next_init().

void rb_fiber_reset_root_local_storage ( VALUE  thval)
VALUE rb_fiber_resume ( VALUE  fibval,
int  argc,
VALUE argv 
)
static VALUE rb_fiber_s_current ( VALUE  klass)
static

Definition at line 1529 of file cont.c.

References rb_fiber_current().

Referenced by ruby_Init_Fiber_as_Coroutine().

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

Definition at line 1515 of file cont.c.

References rb_fiber_yield().

Referenced by Init_Cont().

void rb_fiber_start ( void  )
static void rb_fiber_terminate ( rb_fiber_t fib)
static
VALUE rb_fiber_transfer ( VALUE  fib,
int  argc,
VALUE argv 
)

Definition at line 1372 of file cont.c.

References fiber_switch().

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

VALUE rb_fiber_yield ( int  argc,
VALUE argv 
)

Definition at line 1394 of file cont.c.

References rb_fiber_transfer(), and return_fiber().

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

VALUE rb_obj_is_fiber ( VALUE  obj)

Definition at line 363 of file cont.c.

References Qfalse, Qtrue, and rb_typeddata_is_kind_of().

Referenced by rb_objspace_call_finalizer().

static VALUE return_fiber ( void  )
static
static rb_fiber_t* root_fiber_alloc ( rb_thread_t th)
static
void ruby_Init_Continuation_body ( void  )
void ruby_Init_Fiber_as_Coroutine ( void  )

Variable Documentation

static const rb_data_type_t cont_data_type
static
Initial value:
= {
"continuation",
}
static void cont_free(void *ptr)
Definition: cont.c:217
static void cont_mark(void *ptr)
Definition: cont.c:170
static size_t cont_memsize(const void *ptr)
Definition: cont.c:270

Definition at line 150 of file cont.c.

static const rb_data_type_t fiber_data_type
static
Initial value:
= {
"fiber",
}
static size_t fiber_memsize(const void *ptr)
Definition: cont.c:348
static void fiber_mark(void *ptr)
Definition: cont.c:298
static void fiber_free(void *ptr)
Definition: cont.c:331

Definition at line 150 of file cont.c.

VALUE rb_cContinuation
static

Definition at line 151 of file cont.c.

Referenced by cont_capture(), and ruby_Init_Continuation_body().

VALUE rb_cFiber
static

Definition at line 152 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 153 of file cont.c.

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