From e6c3c4e48c6187212b5bb21b5fdb521660b6b510 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 14 Nov 2011 13:52:35 -0800 Subject: rt: More work on morestack --- src/rt/rust_task.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'src/rt/rust_task.cpp') diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index 6d5241ff344..ae893c93fa0 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -8,11 +8,14 @@ #ifndef __WIN32__ #include #endif +#include #include #include #include "globals.h" +#define RED_ZONE_SIZE 128 + // Stack size size_t g_custom_min_stack_size = 0; @@ -34,16 +37,16 @@ new_stk(rust_scheduler *sched, rust_task *task, size_t minsz) size_t min_stk_bytes = get_min_stk_size(sched->min_stack_size); if (minsz < min_stk_bytes) minsz = min_stk_bytes; - size_t sz = sizeof(stk_seg) + minsz; + size_t sz = sizeof(stk_seg) + minsz + RED_ZONE_SIZE; stk_seg *stk = (stk_seg *)task->malloc(sz, "stack"); LOGPTR(task->sched, "new stk", (uintptr_t)stk); memset(stk, 0, sizeof(stk_seg)); stk->next = task->stk; - stk->limit = (uintptr_t) &stk->data[minsz]; + stk->limit = (uintptr_t) &stk->data[minsz + RED_ZONE_SIZE]; LOGPTR(task->sched, "stk limit", stk->limit); stk->valgrind_id = VALGRIND_STACK_REGISTER(&stk->data[0], - &stk->data[minsz]); + &stk->data[minsz + RED_ZONE_SIZE]); task->stk = stk; return stk; } @@ -63,18 +66,32 @@ del_stk(rust_task *task, stk_seg *stk) // Entry points for `__morestack` (see arch/*/morestack.S). extern "C" void * rust_new_stack(size_t stk_sz, void *args_addr, size_t args_sz) { + std::cerr << "*** New stack!\n"; + rust_task *task = rust_scheduler::get_task(); + if (!task) + return NULL; + stk_seg *stk_seg = new_stk(task->sched, task, stk_sz); memcpy(stk_seg->data, args_addr, args_sz); return stk_seg->data; } -extern "C" void * +extern "C" void rust_del_stack() { rust_task *task = rust_scheduler::get_task(); - stk_seg *next_seg = task->stk->next; del_stk(task, task->stk); - return next_seg->data; +} + +extern "C" void * +rust_get_prev_stack() { + rust_task *task = rust_scheduler::get_task(); + return task->stk->next; +} + +extern "C" rust_task * +rust_get_task() { + return rust_scheduler::get_task(); } -- cgit 1.4.1-3-g733a5