liblightning/
stack.rs

1use platform;
2
3pub struct Stack {
4    mem: *mut [u8]
5}
6
7unsafe impl Send for Stack {}
8
9impl Stack {
10    pub fn new(stack_size: usize) -> Stack {
11        // Allocate one more page as the guard page
12        let mem = platform::setup_stack(stack_size + *platform::PAGE_SIZE);
13        unsafe {
14            platform::setup_stack_guard_page(mem);
15        }
16        Stack {
17            mem: mem
18        }
19    }
20
21    pub fn initial_rsp(&self) -> usize {
22        let mem = unsafe { &mut *self.mem };
23        &mut mem[0] as *mut u8 as usize + mem.len()
24    }
25
26    pub fn get_mem(&self) -> *mut [u8] {
27        self.mem
28    }
29}
30
31impl Drop for Stack {
32    fn drop(&mut self) {
33        unsafe {
34            platform::free_stack(self.mem);
35        }
36    }
37}