MAKECONTEXT(3C) | Standard C Library Functions | MAKECONTEXT(3C) |
#include <ucontext.h> void makecontext(ucontext_t *ucp, void (*func)(), int argc...);
int swapcontext(ucontext_t *restrict oucp, const ucontext_t *restrict ucp);
Before a call is made to makecontext(), the context being modified should have a stack allocated for it. The stack is assigned to the context by initializing the uc_stack member.
The uc_link member is used to determine the context that will be resumed when the context being modified by makecontext() returns. The uc_link member should be initialized prior to the call to makecontext(). If the uc_link member is initialized to NULL, the thread executing func will exit when func returns. See pthread_exit(3C).
The swapcontext() function saves the current context in the context structure pointed to by oucp and sets the context to the context structure pointed to by ucp.
If the ucp or oucp argument points to an invalid address, the behavior is undefined and errno may be set to EFAULT.
ENOMEM
The swapcontext() function may fail if:
EFAULT
#include <stdio.h> #include <ucontext.h> #include <sys/mman.h> void assign(long a, int *b) { *b = (int)a; } int main(int argc, char **argv) { ucontext_t uc, back; size_t sz = 0x10000; int value = 0; getcontext(&uc); uc.uc_stack.ss_sp = mmap(0, sz, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); uc.uc_stack.ss_size = sz; uc.uc_stack.ss_flags = 0; uc.uc_link = &back; makecontext(&uc, assign, 2, 100L, &value); swapcontext(&back, &uc); printf("done %d\n", value); return (0); }
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Interface Stability | Standard |
MT-Level | MT-Safe |
This change in the meaning of ss_sp is now the default behavior. The -D__MAKECONTEXT_V2_SOURCE compilation flag used in Solaris 9 update releases to access this behavior is obsolete.
Binary compatibility has been preserved with releases prior to Solaris 10. Before recompiling, applications that use makecontext() must be updated to reflect this behavior change. The example below demonstrates a typical change that must be applied:
--- example1_s9.c Thu Oct 3 11:58:17 2002 +++ example1.c Thu Jun 27 13:28:16 2002 @@ -27,12 +27,9 @@ uc.uc_stack.ss_sp = mmap(0, sz, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); - uc.uc_stack.ss_sp = (char *)uc.uc_stack.ss_sp + sz - 8; uc.uc_stack.ss_size = sz; uc.uc_stack.ss_flags = 0; uc.uc_link = &back makecontext(&uc, assign, 2, 100L, &value);
February 17, 2023 | OmniOS |