/* Copyright (c) 2013 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * alarm: basic functionality test for the #alarm device */

#include <stdlib.h>
#include <stdio.h>
#include <parlib/parlib.h>
#include <unistd.h>
#include <parlib/event.h>
#include <benchutil/measure.h>
#include <benchutil/alarm.h>
#include <parlib/uthread.h>
#include <parlib/timing.h>

/* Am I the only one annoyed at how open has different includes than
 * close/read/write? */
/* NO. Ron. */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static void handle_alarm(struct event_msg *ev_msg, unsigned int ev_type,
                         void *data)
{
	assert(ev_type == EV_ALARM);
	printf("\tAlarm fired!, id %p\n", devalarm_get_id(ev_msg));
}

int main(int argc, char **argv)
{
	int ctlfd, timerfd, alarm_nr, ret, srvfd;
	char buf[20];
	struct event_queue *ev_q;

	printf("Starting alarm test\n");
	if (devalarm_get_fds(&ctlfd, &timerfd, 0)) {
		perror("Alarm setup");
		exit(-1);
	}
	/* Since we're doing SPAM_PUBLIC later, we actually don't need a big ev_q.
	 * But someone might copy/paste this and change a flag. */
	register_ev_handler(EV_ALARM, handle_alarm, 0);
	if (!(ev_q = get_eventq(EV_MBOX_UCQ))) {
		perror("Failed ev_q");	/* it'll actually PF if malloc fails */
		exit(-1);
	}
	ev_q->ev_vcore = 0;
	/* I think this is all the flags we need; gotta write that dissertation
	 * chapter (and event how-to)!  We may get more than one event per alarm, if
	 * we have concurrent preempts/yields. */
	ev_q->ev_flags = EVENT_IPI | EVENT_SPAM_PUBLIC | EVENT_WAKEUP;
	/* Register the ev_q for our alarm */
	if (devalarm_set_evq(timerfd, ev_q, 0xdeadbeef)) {
		perror("Failed to set evq");
		exit(-1);
	}
	/* Try to set, then cancel before it should go off */
	if (devalarm_set_time(timerfd, read_tsc() + sec2tsc(1))) {
		perror("Failed to set timer");
		exit(-1);
	}
	if (devalarm_disable(timerfd)) {
		perror("Failed to cancel timer");
		exit(-1);
	}
	uthread_sleep(2);
	printf("No alarm should have fired yet\n");
	/* Try to set and receive */
	if (devalarm_set_time(timerfd, read_tsc() + sec2tsc(1))) {
		perror("Failed to set timer");
		exit(-1);
	}
	uthread_sleep(2);
	close(ctlfd);
	/* get crazy: post the timerfd to #srv, then sleep (or even try to exit), and
	 * then echo into it remotely!  A few limitations:
	 * - if the process is DYING, you won't be able to send an event to it.
	 * - the process won't leave DYING til the srv file is removed. */
	srvfd = open("#srv/alarmtest", O_WRONLY | O_CREAT | O_EXCL, 0666);
	if (srvfd < 0) {
		perror("Failed to open srv file");
		exit(-1);
	}
	ret = snprintf(buf, sizeof(buf), "%d", timerfd);
	ret = write(srvfd, buf, ret);
	if (ret <= 0) {
		perror("Failed to post timerfd");
		exit(-1);
	}
	printf("Sleeping for 10 sec, try to echo 111 > '#srv/alarmtest' now!\n");
	uthread_sleep(10);
	ret = unlink("#srv/alarmtest");
	if (ret < 0) {
		perror("Failed to remove timerfd from #srv, proc will never be freed");
		exit(-1);
	}
	printf("Done\n");
	return 0;
}
