Ruby 1.9.3p327(2012-11-10revision37606)
Data Structures | Defines | 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"
Include dependency graph for cont.c:

Go to the source code of this file.

Data Structures

struct  rb_context_struct
struct  rb_fiber_struct

Defines

#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
#define FIBER_VM_STACK_SIZE   (4 * 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 fib)
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

Define Documentation

#define CAPTURE_JUST_VALID_VM_STACK   1

Definition at line 53 of file cont.c.

#define FIBER_USE_NATIVE   0

Definition at line 38 of file cont.c.

#define FIBER_VM_STACK_SIZE   (4 * 1024)

Definition at line 1002 of file cont.c.

Referenced by fiber_init().

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

Definition at line 120 of file cont.c.

Referenced by rb_cont_call().

#define GetFiberPtr (   obj,
  ptr 
)
#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)

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

Enumerator:
CREATED 
RUNNING 
TERMINATED 

Definition at line 83 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 1010 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 275 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 289 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 
) [inline, static]
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 879 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 865 of file cont.c.

References cont_capture(), and rb_yield().

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 1379 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 1085 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 1402 of file cont.c.

References rb_fiber_resume().

Referenced by Init_Cont().

static VALUE rb_fiber_m_transfer ( int  argc,
VALUE argv,
VALUE  fib 
) [static]

Definition at line 1426 of file cont.c.

References rb_fiber_transfer().

Referenced by ruby_Init_Fiber_as_Coroutine().

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

Definition at line 1091 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 1456 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 1442 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 1332 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 1351 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 328 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",
    {cont_mark, cont_free, cont_memsize,},
}

Definition at line 115 of file cont.c.

Initial value:
 {
    "fiber",
    {fiber_mark, fiber_free, fiber_memsize,},
}

Definition at line 115 of file cont.c.

Definition at line 116 of file cont.c.

Referenced by cont_capture(), and ruby_Init_Continuation_body().

VALUE rb_cFiber [static]

Definition at line 117 of file cont.c.

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

Definition at line 118 of file cont.c.

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