Back to index

glibc  2.9
Functions | Variables
swapcontext.c File Reference
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
#include <sys/time.h>

Go to the source code of this file.

Functions

static void f (int n)
void handler (int signal)
int main (void)

Variables

static volatile int expired
static ucontext_t uc [3]
static int switches

Function Documentation

static void f ( int  n) [static]

Definition at line 20 of file swapcontext.c.

{
  int m = 0;
  while (1)
    {
      /* This is where the work would be done.  */
      if (++m % 100 == 0)
        {
          putchar ('.');
          fflush (stdout);
        }

      /* Regularly the @var{expire} variable must be checked.  */
      if (expired)
        {
          /* We do not want the program to run forever.  */
          if (++switches == 20)
            return;

          printf ("\nswitching from %d to %d\n", n, 3 - n);
          expired = 0;
          /* Switch to the other context, saving the current one.  */
          swapcontext (&uc[n], &uc[3 - n]);
        }
    }
}

Here is the call graph for this function:

void handler ( int  signal)

Definition at line 49 of file swapcontext.c.

{
  expired = 1;
}

Here is the caller graph for this function:

int main ( void  )

Definition at line 56 of file swapcontext.c.

{
  struct sigaction sa;
  struct itimerval it;
  char st1[8192];
  char st2[8192];

  /* Initialize the data structures for the interval timer.  */
  sa.sa_flags = SA_RESTART;
  sigfillset (&sa.sa_mask);
  sa.sa_handler = handler;
  it.it_interval.tv_sec = 0;
  it.it_interval.tv_usec = 1;
  it.it_value = it.it_interval;

  /* Install the timer and get the context we can manipulate.  */
  if (sigaction (SIGPROF, &sa, NULL) < 0
      || setitimer (ITIMER_PROF, &it, NULL) < 0
      || getcontext (&uc[1]) == -1
      || getcontext (&uc[2]) == -1)
    abort ();

  /* Create a context with a separate stack which causes the
     function @code{f} to be call with the parameter @code{1}.
     Note that the @code{uc_link} points to the main context
     which will cause the program to terminate once the function
     return.  */
  uc[1].uc_link = &uc[0];
  uc[1].uc_stack.ss_sp = st1;
  uc[1].uc_stack.ss_size = sizeof st1;
  makecontext (&uc[1], (void (*) (void)) f, 1, 1);

  /* Similarly, but @code{2} is passed as the parameter to @code{f}.  */
  uc[2].uc_link = &uc[0];
  uc[2].uc_stack.ss_sp = st2;
  uc[2].uc_stack.ss_size = sizeof st2;
  makecontext (&uc[2], (void (*) (void)) f, 1, 2);

  /* Start running.  */
  swapcontext (&uc[0], &uc[1]);
  putchar ('\n');

  return 0;
}

Here is the call graph for this function:


Variable Documentation

volatile int expired [static]

Definition at line 8 of file swapcontext.c.

int switches [static]

Definition at line 14 of file swapcontext.c.

ucontext_t uc[3] [static]

Definition at line 11 of file swapcontext.c.