diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-11-14 13:52:35 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-16 18:00:57 -0800 |
| commit | 68aff2ad6d55a051e9347aa38f945d114f282691 (patch) | |
| tree | 8ebf0d163fd9016b4b1164de3ebc4acd64e97137 /src/rt/rust_task.cpp | |
| parent | 819955844387a666b31039a030379287106dc488 (diff) | |
| download | rust-68aff2ad6d55a051e9347aa38f945d114f282691.tar.gz rust-68aff2ad6d55a051e9347aa38f945d114f282691.zip | |
rt: More work on morestack
Diffstat (limited to 'src/rt/rust_task.cpp')
| -rw-r--r-- | src/rt/rust_task.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
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 <execinfo.h> #endif +#include <iostream> #include <cassert> #include <cstring> #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(); } |
