vmar_unmap_handle_close_thread_exit - unmap memory, close handle, exit
#include <magenta/syscalls.h> mx_status_t mx_vmar_unmap_handle_close_thread_exit(mx_handle_t vmar_handle, uintptr_t addr, size_t len, mx_handle_t close_handle);
vmar_unmap_handle_close_thread_exit() does a sequence of three operations:
mx_vmar_unmap(vmar_handle, addr, len);
The expectation is that the first operation unmaps a region including the calling thread‘s own stack. (It’s not required, but it's permitted.) This is valid for this call, though it would be invalid for mx_vmar_unmap() or any other call.
If the vmar_unmap operation is successful, then this call never returns. If
close_handle is an invalid handle so that the handle_close operation fails, then the thread takes a trap (as if by
vmar_unmap_handle_close_thread_exit() does not return on success.
Same as mx_vmar_unmap().
The intended use for this is for a dying thread to unmap its own stack, close its own thread handle, and exit. The thread handle cannot be closed beforehand because closing the last handle to a thread kills that thread. The stack cannot be unmapped beforehand because the thread must have some stack space on which to make its final system calls.
This call is used for detached threads, while futex_wake_handle_close_thread_exit() is used for joinable threads.