summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--cont.c17
-rw-r--r--version.h2
3 files changed, 19 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index cd728a7377..b88b61b8cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Mar 25 18:07:48 2016 Yutaka Kanemoto <kanemoto@ruby-lang.org>
+
+ * cont.c (rb_fiber_struct): keep context.uc_stack.ss_sp and context.uc_stack.ss_size
+ for later use. Patch by Rei Odaira. [ruby-core:62945] [Bug #9905]
+
Fri Mar 25 17:52:46 2016 Tanaka Akira <akr@fsij.org>
* test/openssl/utils.rb (start_server, server_loop): Use a
diff --git a/cont.c b/cont.c
index 0268a4e18e..edd6cdb78e 100644
--- a/cont.c
+++ b/cont.c
@@ -147,6 +147,12 @@ typedef struct rb_fiber_struct {
void *fib_handle;
#else
ucontext_t context;
+ /* Because context.uc_stack.ss_sp and context.uc_stack.ss_size
+ * are not necessarily valid after makecontext() or swapcontext(),
+ * they are saved in these variables for later use.
+ */
+ void *ss_sp;
+ size_t ss_size;
#endif
#endif
} rb_fiber_t;
@@ -243,11 +249,11 @@ cont_free(void *ptr)
#else /* not WIN32 */
if (GET_THREAD()->fiber != cont->self) {
rb_fiber_t *fib = (rb_fiber_t*)cont;
- if (fib->context.uc_stack.ss_sp) {
+ if (fib->ss_sp) {
if (cont->type == ROOT_FIBER_CONTEXT) {
rb_bug("Illegal root fiber parameter");
}
- munmap((void*)fib->context.uc_stack.ss_sp, fib->context.uc_stack.ss_size);
+ munmap((void*)fib->ss_sp, fib->ss_size);
}
}
else {
@@ -667,6 +673,8 @@ fiber_initialize_machine_stack_context(rb_fiber_t *fib, size_t size)
context->uc_link = NULL;
context->uc_stack.ss_sp = ptr;
context->uc_stack.ss_size = size;
+ fib->ss_sp = ptr;
+ fib->ss_size = size;
makecontext(context, rb_fiber_start, 0);
sth->machine.stack_start = (VALUE*)(ptr + STACK_DIR_UPPER(0, size));
sth->machine.stack_maxsize = size - RB_PAGE_SIZE;
@@ -1257,8 +1265,9 @@ rb_fiber_terminate(rb_fiber_t *fib)
fib->status = TERMINATED;
#if FIBER_USE_NATIVE && !defined(_WIN32)
/* Ruby must not switch to other thread until storing terminated_machine_stack */
- terminated_machine_stack.ptr = fib->context.uc_stack.ss_sp;
- terminated_machine_stack.size = fib->context.uc_stack.ss_size / sizeof(VALUE);
+ terminated_machine_stack.ptr = fib->ss_sp;
+ terminated_machine_stack.size = fib->ss_size / sizeof(VALUE);
+ fib->ss_sp = NULL;
fib->context.uc_stack.ss_sp = NULL;
fib->cont.machine.stack = NULL;
fib->cont.machine.stack_size = 0;
diff --git a/version.h b/version.h
index 1f27ae507f..1d0cba6b4b 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.1.9"
#define RUBY_RELEASE_DATE "2016-03-25"
-#define RUBY_PATCHLEVEL 470
+#define RUBY_PATCHLEVEL 471
#define RUBY_RELEASE_YEAR 2016
#define RUBY_RELEASE_MONTH 3