trusty (3) makecontext.3posix.gz

Provided by: manpages-posix-dev_2.16-1_all bug

NAME

       makecontext, swapcontext - manipulate user contexts

SYNOPSIS

       #include <ucontext.h>

       void makecontext(ucontext_t *ucp, void (*func)(void),
              int argc, ...);
       int swapcontext(ucontext_t *restrict oucp,
              const ucontext_t *restrict ucp);

DESCRIPTION

       The  makecontext()  function  shall modify the context specified by ucp, which has been initialized using
       getcontext().  When this context is resumed using swapcontext() or setcontext(), program execution  shall
       continue by calling func, passing it the arguments that follow argc in the makecontext() call.

       Before  a call is made to makecontext(), the application shall ensure that the context being modified has
       a stack allocated for it. The application shall ensure that the value  of  argc  matches  the  number  of
       arguments of type int passed to func; otherwise, the behavior is undefined.

       The uc_link member is used to determine the context that shall be resumed when the context being modified
       by makecontext() returns. The application shall ensure that the uc_link member is  initialized  prior  to
       the call to makecontext().

       The swapcontext() function shall save the current context in the context structure pointed to by oucp and
       shall set the context to the context structure pointed to by ucp.

RETURN VALUE

       Upon successful completion, swapcontext() shall return 0. Otherwise, -1 shall be returned and  errno  set
       to indicate the error.

ERRORS

       The swapcontext() function shall fail if:

       ENOMEM The ucp argument does not have enough stack left to complete the operation.

       The following sections are informative.

EXAMPLES

       The following example illustrates the use of makecontext():

              #include <stdio.h>
              #include <ucontext.h>

              static ucontext_t ctx[3];

              static void
              f1 (void)
              {
                  puts("start f1");
                  swapcontext(&ctx[1], &ctx[2]);
                  puts("finish f1");
              }

              static void
              f2 (void)
              {
                  puts("start f2");
                  swapcontext(&ctx[2], &ctx[1]);
                  puts("finish f2");
              }

              int
              main (void)
              {
                  char st1[8192];
                  char st2[8192];

                  getcontext(&ctx[1]);
                  ctx[1].uc_stack.ss_sp = st1;
                  ctx[1].uc_stack.ss_size = sizeof st1;
                  ctx[1].uc_link = &ctx[0];
                  makecontext(&ctx[1], f1, 0);

                  getcontext(&ctx[2]);
                  ctx[2].uc_stack.ss_sp = st2;
                  ctx[2].uc_stack.ss_size = sizeof st2;
                  ctx[2].uc_link = &ctx[1];
                  makecontext(&ctx[2], f2, 0);

                  swapcontext(&ctx[0], &ctx[2]);
                  return 0;
              }

APPLICATION USAGE

       None.

RATIONALE

       None.

FUTURE DIRECTIONS

       None.

SEE ALSO

       exit()   ,   getcontext()   ,   sigaction()   ,   sigprocmask()   ,   the   Base  Definitions  volume  of
       IEEE Std 1003.1-2001, <ucontext.h>

       Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2003 Edition,
       Standard  for  Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base
       Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics Engineers,
       Inc  and  The  Open Group. In the event of any discrepancy between this version and the original IEEE and
       The Open Group Standard, the original IEEE and The Open Group  Standard  is  the  referee  document.  The
       original Standard can be obtained online at http://www.opengroup.org/unix/online.html .