NetBSD/regress/lib/libc/context/context.c
2004-07-19 06:36:27 +00:00

54 lines
873 B
C

/* $NetBSD: context.c,v 1.3 2004/07/19 06:36:27 chs Exp $ */
#include <malloc.h>
#include <ucontext.h>
#include <stdarg.h>
#include <err.h>
#define STACKSZ (10*1024)
#define DEPTH 3
int calls;
void
run(int n, ...)
{
va_list va;
int i, ia;
if (n != DEPTH - calls - 1)
exit (1);
va_start(va, n);
for (i = 0; i < 9; i++) {
ia = va_arg(va, int);
if (ia != i)
errx(2, "arg[%d]=%d", i, ia);
}
va_end(va);
calls++;
}
main()
{
ucontext_t uc[DEPTH];
int i, res;
for (i = 0; i < DEPTH; i++) {
res = getcontext(&uc[i]);
if (res)
err(1, "getcontext");
uc[i].uc_stack.ss_sp = malloc(STACKSZ);
uc[i].uc_stack.ss_size = STACKSZ;
if (i > 0)
uc[i].uc_link = &uc[i - 1];
makecontext(&uc[i], (void *)run, 10, i,
0, 1, 2, 3, 4, 5, 6, 7, 8);
}
res = setcontext(&uc[DEPTH-1]);
if (res)
err(1, "setcontext");
/* NOTREACHED */
return (3);
}