rt: Add constructors and destructors for stacks
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
#ifndef RUST_STACK_H
|
||||||
|
#define RUST_STACK_H
|
||||||
|
|
||||||
struct stk_seg {
|
struct stk_seg {
|
||||||
stk_seg *prev;
|
stk_seg *prev;
|
||||||
stk_seg *next;
|
stk_seg *next;
|
||||||
@@ -10,6 +13,19 @@ struct stk_seg {
|
|||||||
uint8_t data[];
|
uint8_t data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
stk_seg *
|
||||||
|
create_stack(T allocer, size_t sz) {
|
||||||
|
size_t total_sz = sizeof(stk_seg) + sz;
|
||||||
|
return (stk_seg *)allocer->malloc(total_sz, "stack");
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void
|
||||||
|
destroy_stack(T allocer, stk_seg *stk) {
|
||||||
|
allocer->free(stk);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
config_valgrind_stack(stk_seg *stk);
|
config_valgrind_stack(stk_seg *stk);
|
||||||
|
|
||||||
@@ -21,3 +37,5 @@ add_stack_canary(stk_seg *stk);
|
|||||||
|
|
||||||
void
|
void
|
||||||
check_stack_canary(stk_seg *stk);
|
check_stack_canary(stk_seg *stk);
|
||||||
|
|
||||||
|
#endif /* RUST_STACK_H */
|
||||||
|
|||||||
@@ -538,7 +538,7 @@ void
|
|||||||
rust_task::free_stack(stk_seg *stk) {
|
rust_task::free_stack(stk_seg *stk) {
|
||||||
LOGPTR(thread, "freeing stk segment", (uintptr_t)stk);
|
LOGPTR(thread, "freeing stk segment", (uintptr_t)stk);
|
||||||
total_stack_sz -= user_stack_size(stk);
|
total_stack_sz -= user_stack_size(stk);
|
||||||
free(stk);
|
destroy_stack(this, stk);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -581,8 +581,8 @@ rust_task::new_stack(size_t requested_sz) {
|
|||||||
fail();
|
fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t sz = sizeof(stk_seg) + rust_stk_sz + RED_ZONE_SIZE;
|
size_t sz = rust_stk_sz + RED_ZONE_SIZE;
|
||||||
stk_seg *new_stk = (stk_seg *)malloc(sz, "stack");
|
stk_seg *new_stk = create_stack(this, sz);
|
||||||
LOGPTR(thread, "new stk", (uintptr_t)new_stk);
|
LOGPTR(thread, "new stk", (uintptr_t)new_stk);
|
||||||
memset(new_stk, 0, sizeof(stk_seg));
|
memset(new_stk, 0, sizeof(stk_seg));
|
||||||
add_stack_canary(new_stk);
|
add_stack_canary(new_stk);
|
||||||
|
|||||||
Reference in New Issue
Block a user