#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>


#define MAXT 10

static void
sig(int s)
{
	struct timespec ts = { 100000, 0 };
	printf("got %p\n", &ts);
	nanosleep(&ts, NULL);
}

void *
run(void *v)
{
	size_t *i = v;
	int c = *i;



	for (;;) {
//		printf("%d %zu\n", c, *i);
		sleep(1);
	}
}

int
main(int argc, char *argv[])
{
	pthread_t t[MAXT];

	stack_t ss;
	ss.ss_sp = malloc(SIGSTKSZ);
	printf("%p\n", ss.ss_sp);
	ss.ss_flags = 0;
	ss.ss_size = SIGSTKSZ;
	sigaltstack(&ss, NULL);

	struct sigaction sa;
	sa.sa_handler = sig;
	sa.sa_flags = SA_ONSTACK | SA_RESTART;
	sigemptyset(&sa.sa_mask);
	sigaction(SIGUSR1, &sa, NULL);

	for (size_t i = 0; i < MAXT; i++) {
	    pthread_create(&t[i], NULL, run, &i);
	    sched_yield();
	}
	printf("sleeping\n");
	sleep(5);
	for (size_t i = 0; i < MAXT; i++) {
		pthread_kill(t[i], SIGUSR1);
	}
	printf("waiting\n");
	sleep(5);
//	pthread_join();
	return 0;
}