Project

General

Profile

Feature #10341 » 0004-cont_save_thread-Sparse-copying-of-thread-data.patch

nome (Knut Franke), 10/08/2014 11:59 AM

View differences:

cont.c
int register_stack_size;
#endif
} machine;
rb_thread_t saved_thread;
rb_thread_t saved_thread; /* selected properties of GET_THREAD() (see cont_save_thread) */
rb_jmpbuf_t jmpbuf;
rb_ensure_entry_t *ensure_array;
rb_ensure_list_t *ensure_list;
......
static void
cont_save_thread(rb_context_t *cont, rb_thread_t *th)
{
rb_thread_t *sth = &cont->saved_thread;
/* save thread context */
cont->saved_thread = *th;
sth->stack = th->stack;
sth->stack_size = th->stack_size;
sth->local_storage = th->local_storage;
sth->cfp = th->cfp;
sth->safe_level = th->safe_level;
sth->raised_flag = th->raised_flag;
sth->state = th->state;
sth->status = th->status;
sth->tag = th->tag;
sth->protect_tag = th->protect_tag;
sth->errinfo = th->errinfo;
sth->first_proc = th->first_proc;
sth->root_lep = th->root_lep;
sth->root_svar = th->root_svar;
sth->ensure_list = th->ensure_list;
sth->trace_arg = th->trace_arg;
/* saved_thread->machine.stack_(start|end) should be NULL */
/* because it may happen GC afterward */
cont->saved_thread.machine.stack_start = 0;
cont->saved_thread.machine.stack_end = 0;
sth->machine.stack_start = 0;
sth->machine.stack_end = 0;
#ifdef __ia64
cont->saved_thread.machine.register_stack_start = 0;
cont->saved_thread.machine.register_stack_end = 0;
sth->machine.register_stack_start = 0;
sth->machine.register_stack_end = 0;
#endif
}
......
{
/* save thread context */
cont_save_thread(cont, th);
cont->saved_thread.self = th->self;
cont->saved_thread.machine.stack_maxsize = th->machine.stack_maxsize;
cont->saved_thread.fiber = th->fiber;
cont->saved_thread.local_storage = 0;
}
......
rb_fiber_t *fib = fiber_t_alloc(fibval);
rb_context_t *cont = &fib->cont;
rb_thread_t *th = &cont->saved_thread;
rb_thread_t *cth = GET_THREAD();
/* initialize cont */
cont->vm_stack = 0;
......
th->stack = 0;
th->stack_size = 0;
th->stack_size = th->vm->default_params.fiber_vm_stack_size / sizeof(VALUE);
th->stack_size = cth->vm->default_params.fiber_vm_stack_size / sizeof(VALUE);
th->stack = ALLOC_N(VALUE, th->stack_size);
th->cfp = (void *)(th->stack + th->stack_size);
......
th->first_proc = proc;
#if !FIBER_USE_NATIVE
MEMCPY(&cont->jmpbuf, &th->root_jmpbuf, rb_jmpbuf_t, 1);
MEMCPY(&cont->jmpbuf, &cth->root_jmpbuf, rb_jmpbuf_t, 1);
#endif
return fibval;
(4-4/6)