about summary refs log tree commit diff
path: root/src/rt/rust_stack.cpp
diff options
context:
space:
mode:
authorBrian Anderson <andersrb@gmail.com>2013-02-07 13:46:10 -0800
committerBrian Anderson <andersrb@gmail.com>2013-02-07 13:46:10 -0800
commit6e9298ab888b425e9a395e87aa750feeaadb2e83 (patch)
tree8cacab08ce22357c491dc06f8493fa3e016d605e /src/rt/rust_stack.cpp
parenta2817953d0a9129ba20b6400cfd53260ab505f40 (diff)
parente43c5bdc6b47e8dd5e2ddcd6cf57fec79388523a (diff)
downloadrust-6e9298ab888b425e9a395e87aa750feeaadb2e83.tar.gz
rust-6e9298ab888b425e9a395e87aa750feeaadb2e83.zip
Merge pull request #4619 from brson/exchange
Some work on freestanding Rust: foreign calls, exchange allocator
Diffstat (limited to 'src/rt/rust_stack.cpp')
-rw-r--r--src/rt/rust_stack.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/rt/rust_stack.cpp b/src/rt/rust_stack.cpp
index 466399bd5b5..3bcda8adf40 100644
--- a/src/rt/rust_stack.cpp
+++ b/src/rt/rust_stack.cpp
@@ -53,6 +53,8 @@ check_stack_canary(stk_seg *stk) {
     assert(stk->canary == canary_value && "Somebody killed the canary");
 }
 
+// XXX: Duplication here between the local and exchange heap constructors
+
 stk_seg *
 create_stack(memory_region *region, size_t sz) {
     size_t total_sz = sizeof(stk_seg) + sz;
@@ -69,3 +71,20 @@ destroy_stack(memory_region *region, stk_seg *stk) {
     deregister_valgrind_stack(stk);
     region->free(stk);
 }
+
+stk_seg *
+create_exchange_stack(rust_exchange_alloc *exchange, size_t sz) {
+    size_t total_sz = sizeof(stk_seg) + sz;
+    stk_seg *stk = (stk_seg *)exchange->malloc(total_sz, false);
+    memset(stk, 0, sizeof(stk_seg));
+    stk->end = (uintptr_t) &stk->data[sz];
+    add_stack_canary(stk);
+    register_valgrind_stack(stk);
+    return stk;
+}
+
+void
+destroy_exchange_stack(rust_exchange_alloc *exchange, stk_seg *stk) {
+    deregister_valgrind_stack(stk);
+    exchange->free(stk);
+}