56 lines
1.0 KiB
C
56 lines
1.0 KiB
C
/* { dg-do run } */
|
|
/* { dg-require-effective-target split_stack } */
|
|
/* { dg-require-effective-target pthread_h } */
|
|
/* { dg-options "-pthread -fsplit-stack" } */
|
|
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
|
|
/* Use a noinline function to ensure that the buffer is not removed
|
|
from the stack. */
|
|
static void use_buffer (char *buf) __attribute__ ((noinline));
|
|
static void
|
|
use_buffer (char *buf)
|
|
{
|
|
buf[0] = '\0';
|
|
}
|
|
|
|
/* Each recursive call uses 10,000 bytes. We call it 1000 times,
|
|
using a total of 10,000,000 bytes. If -fsplit-stack is not
|
|
working, that will overflow our stack limit. */
|
|
|
|
static void
|
|
down (int i)
|
|
{
|
|
char buf[10000];
|
|
|
|
if (i > 0)
|
|
{
|
|
use_buffer (buf);
|
|
down (i - 1);
|
|
}
|
|
}
|
|
|
|
static void *
|
|
thread_routine (void *arg __attribute__ ((unused)))
|
|
{
|
|
down (1000);
|
|
return NULL;
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
int i;
|
|
pthread_t tid;
|
|
void *dummy;
|
|
|
|
i = pthread_create (&tid, NULL, thread_routine, NULL);
|
|
if (i != 0)
|
|
abort ();
|
|
i = pthread_join (tid, &dummy);
|
|
if (i != 0)
|
|
abort ();
|
|
return 0;
|
|
}
|