/* Copyright (c) 2014 The Regents of the University of California
 * Kevin Klues <klueska@cs.berkeley.edu>
 * See LICENSE for details.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <parlib/parlib.h>
#include <pthread.h>
#include <futex.h>
#include <signal.h>

// Signal handler run in vcore context which redirects signals to userspace by
// waking a thread waiting on a futex. Note, this does not guarantee that every
// signal that comes through this handler will be noticed or processed by the
// thread.
int __sigpending = 0;
void sig_handler(int signr)
{
	__sigpending = 1;
	futex(&__sigpending, FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
}

// User level thread waiting on a futex to count signals
int count = 0;
void *count_signals(void *arg)
{
	while(1) {
		futex(&__sigpending, FUTEX_WAIT, 0, NULL, NULL, 0);
		__sync_fetch_and_add(&count, 1);
		__sigpending = 0;
	}
}

// Thread spamming us with signals
void *sig_thread(void *arg)
{
	int *done = (int*)arg;
	struct sigaction sigact = {.sa_handler = sig_handler, 0};

	sigaction(SIGUSR1, &sigact, 0);
	while(1) {
		kill(getpid(), SIGUSR1);
		cmb();
		if (*done) return NULL;
	}
}

int main(int argc, char **argv)
{
	int done = false;

	pthread_t pth_handle, pth_handle2;
	// Spawn off a thread to spam us with signals
	pthread_create(&pth_handle, NULL, &sig_thread, &done);
	// Spawn off a thread to process those signals
	pthread_create(&pth_handle2, NULL, &count_signals, NULL);

	// Sleep for 3 seconds by timing out on a futex
	int dummy = 0;
	struct timespec timeout = {.tv_sec = 3, 0};

	futex(&dummy, FUTEX_WAIT, 0, &timeout, NULL, 0);
	// Force the signal tread to exit
	cmb();
	done = true;
	pthread_join(pth_handle, NULL);
	printf("count: %d\n", count);
	return 0;
}
