ftmemsim-valgrind/memcheck/tests/stack_changes.c
Nicholas Nethercote 07045477ca Merge the DARWIN branch onto the trunk.
I tried using 'svn merge' to do the merge but it did a terrible job and
there were bazillions of conflicts.  So instead I just took the diff between
the branch and trunk  at r10155, applied the diff to the trunk, 'svn add'ed
the added files (no files needed to be 'svn remove'd) and committed.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10156
2009-05-28 01:53:07 +00:00

76 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
#include "tests/sys_mman.h"
#include "valgrind.h"
#define STACK_SIZE (10 * 4096)
// This test is checking the libc context calls (setcontext, etc.) and
// checks that Valgrind notices their stack changes properly.
#if defined(_AIX) || defined(__APPLE__)
typedef ucontext_t mycontext;
#else /* linux */
typedef struct ucontext mycontext;
#endif
mycontext ctx1, ctx2, oldc;
int count;
void hello(mycontext *newc)
{
printf("hello, world: %d\n", count);
if (count++ == 2)
newc = &oldc;
setcontext(newc);
}
int init_context(mycontext *uc)
{
void *stack;
int ret;
if (getcontext(uc) == -1) {
//perror("getcontext");
printf("getcontext() doesn't seem to work\n");
exit(1);
}
stack = (void *)mmap(0, STACK_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
if (stack == (void*)-1) {
perror("mmap");
exit(1);
}
ret = VALGRIND_STACK_REGISTER(stack, stack + STACK_SIZE);
uc->uc_link = NULL;
uc->uc_stack.ss_sp = stack;
uc->uc_stack.ss_size = STACK_SIZE;
uc->uc_stack.ss_flags = 0;
return ret;
}
int main(int argc, char **argv)
{
int c1 = init_context(&ctx1);
int c2 = init_context(&ctx2);
makecontext(&ctx1, (void (*)()) hello, 1, &ctx2);
makecontext(&ctx2, (void (*)()) hello, 1, &ctx1);
swapcontext(&oldc, &ctx1);
VALGRIND_STACK_DEREGISTER(c1);
//free(ctx1.uc_stack.ss_sp);
VALGRIND_STACK_DEREGISTER(c2);
//free(ctx2.uc_stack.ss_sp);
return 0;
}