pub(crate) fn allocate() -> Self {
        STACK_STORE.with(|s| match s.borrow_mut().pop() {
            None => unsafe {
                let stack = GLOBAL_ALLOC.alloc(STACK_LAYOUT.unwrap());
                protect(stack, DEFAULT_STACK_SIZE, Protection::READ_WRITE)
                    .expect("Mprotect failed.");
                Stack(stack)
            },
            Some(stack) => stack,
        })
    }
Allocate new stack area.

If some `Stack` were saved in `STACK_STORE`, the newest one is returned.
Otherwise, allocate new `Stack` and return it.
ruruby/src/coroutine/stack.rs