(root)/
glibc-2.38/
stdlib/
tst-setcontext8.c
       1  /* Check getcontext and setcontext on the context from makecontext.
       2     Copyright (C) 2018-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <stdio.h>
      20  #include <stdlib.h>
      21  #include <ucontext.h>
      22  #include <unistd.h>
      23  #include <stdatomic.h>
      24  
      25  static ucontext_t ctx[3];
      26  static atomic_int done;
      27  
      28  static void
      29  __attribute__((noinline, noclone))
      30  f2 (void)
      31  {
      32    printf ("start f2\n");
      33    done++;
      34    if (setcontext (&ctx[2]) != 0)
      35      {
      36        printf ("%s: setcontext: %m\n", __FUNCTION__);
      37        exit (EXIT_FAILURE);
      38      }
      39  }
      40  
      41  static void
      42  f1 (void)
      43  {
      44    printf ("start f1\n");
      45    if (getcontext (&ctx[2]) != 0)
      46      {
      47        printf ("%s: getcontext: %m\n", __FUNCTION__);
      48        exit (EXIT_FAILURE);
      49      }
      50    if (done)
      51      exit (EXIT_SUCCESS);
      52    f2 ();
      53  }
      54  
      55  static int
      56  do_test (void)
      57  {
      58    char st1[32768];
      59    puts ("making contexts");
      60    if (getcontext (&ctx[0]) != 0)
      61      {
      62        printf ("%s: getcontext: %m\n", __FUNCTION__);
      63        exit (EXIT_FAILURE);
      64      }
      65    if (getcontext (&ctx[1]) != 0)
      66      {
      67        printf ("%s: getcontext: %m\n", __FUNCTION__);
      68        exit (EXIT_FAILURE);
      69      }
      70    ctx[1].uc_stack.ss_sp = st1;
      71    ctx[1].uc_stack.ss_size = sizeof st1;
      72    ctx[1].uc_link = &ctx[0];
      73    makecontext (&ctx[1], (void (*) (void)) f1, 0);
      74    if (setcontext (&ctx[1]) != 0)
      75      {
      76        printf ("%s: setcontext: %m\n", __FUNCTION__);
      77        exit (EXIT_FAILURE);
      78      }
      79    exit (EXIT_FAILURE);
      80  }
      81  
      82  #include <support/test-driver.c>