summaryrefslogtreecommitdiff
path: root/cont.c
diff options
context:
space:
mode:
authorsamuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-20 10:18:04 +0000
committersamuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-20 10:18:04 +0000
commit8b1b056e1c630e60ad55cee430c8aa92046b3537 (patch)
tree5898fc3d9c85986691fbb1ab6507d9d07822027c /cont.c
parent0ba0ad8b415bd9601d05e14a30d34344dfcc1b71 (diff)
Use malloc/free for windows stack allocation.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65873 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/cont.c b/cont.c
index f480923c5a..7e82b84d80 100644
--- a/cont.c
+++ b/cont.c
@@ -179,7 +179,7 @@ fiber_context_create(ucontext_t *context, void (*func)(), void *arg, void *ptr,
}
#endif
-#if FIBER_USE_NATIVE && !defined(_WIN32)
+#if FIBER_USE_NATIVE
#define MAX_MACHINE_STACK_CACHE 10
static int machine_stack_cache_index = 0;
typedef struct machine_stack_cache_struct {
@@ -413,7 +413,11 @@ cont_free(void *ptr)
if (fiber_is_root_p(fib)) {
rb_bug("Illegal root fiber parameter");
}
+#ifdef _WIN32
+ free((void*)fib->ss_sp);
+#else
munmap((void*)fib->ss_sp, fib->ss_size);
+#endif
}
#elif defined(_WIN32)
if (!fiber_is_root_p(fib)) {
@@ -812,7 +816,12 @@ cont_restore_thread(rb_context_t *cont)
}
#if FIBER_USE_NATIVE
-#ifdef _WIN32
+#if defined(FIBER_USE_COROUTINE)
+COROUTINE fiber_entry(coroutine_context * from, coroutine_context * to)
+{
+ rb_fiber_start();
+}
+#elif defined(_WIN32)
static void
fiber_set_stack_location(void)
{
@@ -830,13 +839,6 @@ fiber_entry(void *arg)
fiber_set_stack_location();
rb_fiber_start();
}
-#else /* _WIN32 */
-
-#if defined(FIBER_USE_COROUTINE)
-COROUTINE fiber_entry(coroutine_context * from, coroutine_context * to)
-{
- rb_fiber_start();
-}
#else
NORETURN(static void fiber_entry(void *arg));
static void
@@ -877,6 +879,9 @@ fiber_machine_stack_alloc(size_t size)
}
}
else {
+#ifdef _WIN32
+ return malloc(size);
+#else
void *page;
STACK_GROW_DIR_DETECTION;
@@ -891,11 +896,11 @@ fiber_machine_stack_alloc(size_t size)
if (mprotect(page, RB_PAGE_SIZE, PROT_NONE) < 0) {
rb_raise(rb_eFiberError, "can't set a guard page: %s", ERRNOMSG);
}
+#endif
}
return ptr;
}
-#endif
static void
fiber_initialize_machine_stack_context(rb_fiber_t *fib, size_t size)
@@ -1712,7 +1717,11 @@ fiber_store(rb_fiber_t *next_fib, rb_thread_t *th)
}
else {
if (terminated_machine_stack.ptr != fib->cont.machine.stack) {
- munmap((void*)terminated_machine_stack.ptr, terminated_machine_stack.size * sizeof(VALUE));
+#ifdef _WIN32
+ free((void*)terminated_machine_stack.ptr);
+#else
+ munmap((void*)terminated_machine_stack.ptr, terminated_machine_stack.size * sizeof(VALUE));
+#endif
}
else {
rb_bug("terminated fiber resumed");