/* Copyright (c) 2013, 2014 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * lock_test: microbenchmark to measure different styles of spinlocks.
 *
 * to build on linux: (hacky)
 * $ gcc -O2 -std=gnu99 -fno-stack-protector -g tests/lock_test.c -lpthread \
 *    -lm -o linux_lock_test */

#define _GNU_SOURCE /* pthread_yield */

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <math.h>
#include <argp.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <string.h>

/* OS dependent #incs */
#ifdef __ros__

#include <parlib/parlib.h>
#include <parlib/stdio.h>
#include <parlib/vcore.h>
#include <parlib/timing.h>
#include <parlib/spinlock.h>
#include <parlib/mcs.h>
#include <parlib/arch/arch.h>
#include <parlib/event.h>

#include <parlib/tsc-compat.h>
#include <benchutil/measure.h>

#else

#include "../user/parlib/include/parlib/tsc-compat.h"
#include "misc-compat.h"
#include "linux-lock-hacks.h" /* TODO: have a build system and lib / C file */

#include "../user/benchutil/include/benchutil/measure.h"
#include "../user/benchutil/measure.c"

static void os_prep_work(pthread_t *worker_threads, int nr_threads)
{
	if (nr_threads > num_vcores())
		printf("WARNING: %d threads requested, but only %d cores available\n",
		       nr_threads, num_vcores());
}

static void os_post_work(pthread_t *worker_threads, int nr_threads)
{
	if (nr_threads > num_vcores())
		return;
	/* assuming we're taking cores 0..nr_threads, and we never move. */
	for (int i = 0; i < nr_threads; i++) {
		cpu_set_t cpuset;
		CPU_ZERO(&cpuset);
		CPU_SET(i, &cpuset);
		pthread_setaffinity_np(worker_threads[i], sizeof(cpu_set_t), &cpuset);
	}
}

#define print_preempt_trace(args...) {}

__thread int __vcore_context = 0;

#endif

/* TODO: There's lot of work to do still, both on this program and on locking
 * and vcore code.  For some of the issues, I'll leave in the discussion /
 * answers, in case it comes up in the future (like when I read this in 8
 * months).
 *
 * BUGS / COMMENTARY
 * 		Occasional deadlocks when preempting and not giving back!
 * 			- with the new PDRs style, though that doesn't mean the older styles
 * 			don't have this problem
 * 			- shouldn't be any weaker than PDR.  they all check pred_vc to see
 * 			if they are running, and if not, they make sure someone runs
 * 			- could be weaker if we have an old value for the lockholder,
 * 			someone outside the chain, and we made sure they ran, and they do
 * 			nothing (spin in the 2LS or something?)
 * 				no, they should have gotten a msg about us being preempted,
 * 				since whoever we turn into gets the message about us swapping.
 * 			- anyway, it's not clear if this is with MCSPDR, event delivery,
 * 			preemption handling, or just an artifact of the test (less likely)
 * 		why aren't MCS locks in uth_ctx getting dealt with?
 * 			- because the event is handled, but the lock holder isn't run.  the
 * 			preemption was dealt with, but nothing saved the lock holder
 * 			- any uthread_ctx lockholder that gets preempted will get
 * 			interrupted, and other cores will handle the preemption.  but that
 * 			uthread won't run again without 2LS support.  either all spinners
 * 			need to be aware of the 'lockholder' (PDR-style), or the 2LS needs
 * 			to know when a uthread becomes a 'lockholder' to make sure it runs
 * 			via user-level preempts.  If the latter, this needs to happen
 * 			atomically with grabbing the lock, or else be able to handle lots of
 * 			fake 'lockholders' (like round-robin among all of them)
 * 		why is the delay more than the expected delay?
 * 			because it takes ~2ms to spawn and run a process
 * 			could do this in a separate process, instead of a script
 * 				could also consider not using pth_test and changing prov, but
 * 				driving it by yields and requests.  would also test the
 * 				alarm/wakeup code (process sets alarm, goes to sleep, wakes up
 * 				and requests X cores)
 * 		why do we get occasional preempt-storms? (lots of change_tos)
 * 			due to the MCS-PDR chain, which i tried fixing by adjusting the
 * 			number of workers down to the number of vcores
 * 			why isn't the worker adaptation working?
 * 				- it actually was working, and nr_workers == nr_vcores.  that
 * 				just wasn't the root cause.
 * 				- was expecting it to cut down on PDR kernel traffic
 * 			- still get periods of low perf
 * 				like O(100) preempt msgs per big preempt/prov
 * 				does it really take that much to work out an MCS-PDR?
 * 			- one thing is that if we fake vc ctx, we never receive preemption
 * 			events.  might be a bad idea.
 * 				- in general, yeah.  faking VC and turning off events can really
 * 				muck with things
 * 				- these events aren't necessarily delivered to a VC who will
 * 				check events any time soon (might be the last one in the chain)
 * 				- the core of the issue is that we have the right amount of
 * 				workers and vcores, but that the system isn't given a chance to
 * 				stabilize itself.  also, if we have some VCs that are just
 * 				sitting around, spinning in the 2LS, if those get preempted, no
 * 				one notices or cares (when faking vc_ctx / getting no events)
 * 			- there is a slight race where we might make someone run who isn't a
 * 			lockholder.  logically, its okay.  worst case, it would act like an
 * 			extra preempt and different startcore, which shouldn't be too bad.
 *
 * 		sanity check: does throughput match latency? (2.5GHz TSC, MCS lock)
 * 			ex: 5000 locks/ms = 5 locks/us = 200ns/lock = 500 ticks / lock
 * 			500 ticks * 31 workers (queue) = 15000 ticks
 * 			avg acquire time was around 14K.  seems fine..
 * 			when our MCSPDR throughput tanks (during preempts), it's around
 * 			400-500 locks/ms, which is around 2us/lock.  
 * 				when the locker on a preempted chain shows up, it needs to
 * 				change to the next one in line. 
 * 					- though that should be in parallel with the other
 * 					lockholders letting go.  shouldn't be that bad
 * 					- no, it is probably at the head of the chain very soon,
 * 					such that it is the bottleneck for the actual lock.  2us
 * 					seems possible
 *
 * 		what does it take to get out of a preemption with (old) MCS-PDR?
 * 			- these are now called pdro locks (old)
 * 			- for a single preempt, it will take 1..n-1 changes.  avg n/2
 * 			- for multiple preempts, it's nr_pre * that (avg np/2, worst np)
 * 			- for every unlock/reacquire cycle (someone unlocks, then rejoins
 * 			the list), its nr_preempts (aka, nr_workers - nr_vcores)
 * 			- if we need to have a specific worker get out of the chain, on
 * 			average, it'd take n/2 cycles (p*n/2 changes)  worst: np
 * 			- if we want to get multiple workers out, the worst case is still
 * 			np, but as p increases, we're more likely to approach n cycles
 * 			- so the current model is np for the initial hit (to move the
 * 			offline VCs to the end of the chain) and another np to get our
 * 			specific workers out of the chain and yielding (2np)
 *
 * 			- but even with 1 preempt, we're getting 80-200 changes per
 *
 * 			- it shouldn't matter that the sys_change_to is really slow, should
 * 			be the same amount of changes.  however, the preempted ones are
 * 			never really at the tail end of the chain - they should end up right
 * 			before the lockholder often.  while the sys_change_tos are slowly
 * 			moving towards the back of the chain, the locking code is quickly
 * 			removing (online) nodes from the head and putting them on the back.
 *
 * 			- end result: based on lock hold time and lock delay time, a
 * 			preempted VC stays in the MCS chain (swaps btw VC/nodes), and when
 * 			it is inside the chain, someone is polling to make them run.  with
 * 			someone polling, it is extremely unlikely that someone outside the
 * 			chain will win the race and be able to change_to before the in-chain
 * 			poller.  to clarify:
 * 				- hold time and delay time matter, since the longer they are,
 * 				the greater the amount of time the change_to percolation has to
 * 				get the preempted VCs to the end of the chain (where no one
 * 				polls them).
 * 				- at least one vcore is getting the event to handle the
 * 				preemption of the in-chain, offline VC.  we could change it so
 * 				every VC polls the preempt_evq, or just wait til whoever is
 * 				getting the messages eventually checks their messages (VC0)
 * 				- if there is an in-chain poller, they will notice the instant
 * 				the VC map changes, and then immediately change_to (and spin on
 * 				the proclock in the kernel).  there's almost no chance of a
 * 				normal preempt event handler doing that faster.  (would require
 * 				some IRQ latency or something serious).
 * 			- adding in any hold time trashes our microbenchmark's perf, but a
 * 			little delay time actually helps: (all with no preempts going on)
 * 				- mcspdr, no delay: 4200-4400 (-w31 -l10000, no faking, etc)
 * 				- mcspdr, d = 1: 4400-4800
 * 				- mcspdr, d = 2: 4200-5200
 * 				- as you add delay, it cuts down on contention for the
 * 				lock->lock cacheline.  but if you add in too much, you'll tank
 * 				throughput (since there is no contention at all).
 * 				- as we increase the delay, we cut down on the chance of the
 * 				preempt storm / preempt-stuck-in-the-chain, though it can still
 * 				happen, even with a delay of 10us
 * 			- maybe add in the lockholder again? (removed in 73701d6bfb)
 * 				- massively cuts performance, like 2x throughput, without
 * 				preempts
 * 				- it's ability to help depends on impl:
 * 					in one version (old style), it didn't help much at all
 * 					- in another (optimized lockholder setting), i can't even
 * 					see the throughput hit, it recovered right away, with O(5)
 * 					messages
 * 					- the diff was having the lockholder assign the vcoreid
 * 					before passing off to the next in the chain, so that there
 * 					is less time with having "no lockholder".  (there's a brief
 * 					period where the lockholder says it is the next person, who
 * 					still spins.  they'll have to make sure their pred runs)
 * 			-adj workers doesn't matter either...
 * 				- the 2LS and preemption handling might be doing this
 * 				automatically, when handle_vc_preempt() does a
 * 				thread_paused() on its current_uthread.
 * 				- adj_workers isn't critical if we're using some locks
 * 				that check notif_pending.  eventually someone hears
 * 				about preempted VCs (assuming we can keep up)
 *
 * 			What about delays?  both hold and delay should make it easier to get
 * 			the preempted vcore to the end of the chain.  but do they have to be
 * 			too big to be reasonable?
 * 				- yes.  hold doesn't really help much until everything is
 * 				slower.  even with a hold of around 1.2us, we still have the
 * 				change_to-storms and lowered throughput.
 * 				- doing a combo helps too.  if you hold for 1ns (quite a bit
 * 				more actually, due to the overhead of ndelay, but sufficient to
 * 				be "doing work"), and delaying for around 7us before rejoining,
 * 				there's only about a 1/5 chance of a single preempt messing us
 * 				up
 * 					- though having multiple preempts outstanding make this less
 * 					likely to work.
 * 					- and it seems like if we get into the storm scenario, we
 * 					never really get out.  either we do quickly or never do.
 * 					depending on the workload, this could be a matter of luck
 *
 * 			So we could try tracking the lockholder, but only looking at it when
 * 			we know someone was preempted in the chain - specifically, when our
 * 			pred is offline.  when that happens, we don't change to them, we
 * 			make sure the lockholder is running.
 * 				- tracking takes us from 4200->2800 throughput or so for MCS
 * 				- 5200 -> 3700 or so for MCS in vc_ctx (__MCSPDR)
 * 				- main spike seems to be in the hold time.  bimodal distrib,
 * 				with most below 91 (the usual is everything packed below 70) and
 * 				a big spike around 320
 *
 * 	Summary:
 * 		So we need to have someone outside the chain change_to the one in the
 * 		chain o/w, someone will always be in the chain.  Right now, it's always
 * 		the next in line who is doing the changing, so a preempted vcore is
 * 		always still in the chain. 
 *
 * 		If the locking workload has some delaying, such as while holding the
 * 		lock or before reacquiring, the "change_to" storm might not be a
 * 		problem.  If it is, the only alternative I have so far is to check the
 * 		lockholder (which prevents a chain member from always ensuring their
 * 		pred runs).  This hurts the lock's scalability/performance when we
 * 		aren't being preempted.  On the otherhand, based on what you're doing
 * 		with the lock, one more cache miss might not be as big of a deal as in
 * 		lock_test.  Especially if when you get stormed, your throughput could be
 * 		terrible and never recover.
 *
 * 		Similar point: you can use spinpdr locks.  They have the PDR-benefits,
 * 		and won't induce the storm of change_tos.  However, this isn't much
 * 		better for contended locks.  They perform 2-3x worse (on c89) without
 * 		preemption.  Arguably, if you were worried about the preempt storms and
 * 		want scalability, you might want to use mcspdr with lockholders.
 *
 * 		The MCSPDRS (now just callced MCSPDR, these are default) locks can avoid
 * 		the storm, but at the cost of a little more in performance.  mcspdrs
 * 		style is about the same when not getting preempted from uth ctx compared
 * 		to mcspdr (slight drop).  When in vc ctx, it's about 10-20% perf hit
 * 		(PDRS gains little from --vc_ctx). 
 *
 * 		Turns out there is a perf hit to PDRS (and any non-stack based qnode)
 * 		when running on c89.  The issue is that after shuffling the vcores
 * 		around, they are no longer mapped nicely to pcores (VC0->PC1, VC1->PC2).
 * 		This is due to some 'false sharing' of the cachelines, caused mostly by
 * 		aggressive prefetching (notably the intel adjacent cacheline prefetcher,
 * 		which grabs two CLs at a time!).  Basically, stack-based qnodes are
 * 		qnodes that are very far apart in memory.  Cranking up the padding in
 * 		qnodes in the "qnodes-in-locks" style replicates this.
 *
 * 		For some info on the prefetching:
 * 			http://software.intel.com/en-us/articles/optimizing-application-performance-on-intel-coret-microarchitecture-using-hardware-implemented-prefetchers/
 * 			http://software.intel.com/en-us/forums/topic/341769
 *
 * 		Here's some rough numbers of the different styles for qnodes on c89.
 * 		'in order' is VCn->PC(n+1) (0->1, 1->2).  Worst order is with even VCs
 * 		on one socket, odds on the other.  the number of CLs is the size of a
 * 		qnode.  mcspdr is the new style (called mcspdrs in some places in this
 * 		document), with lock-based qnodes.  mcspdr2 is the same, but with
 * 		stack-based qnodes.  mcspdro is the old style (bad a recovery), stack
 * 		based, sometimes just called mcs-pdr
 *
 * 		with prefetchers disabled (MCS and DCU)
 * 			mcspdr   1CL  4.8-5.4 in order, 3.8-4.2 worst order
 * 			mcspdr   2CL          in order,         worst order
 * 			mcspdr   4CL  5.2-6.0 in order, 4.7-5.3 worst order
 * 			mcspdr   8CL  5.4-6.7 in order, 5.2-6.2 worst order
 * 			mcspdr  16CL  5.1-5.8 in order, 5.2-6.8 worst order
 * 			mcspdr2 stck          in order,         worst order
 * 			mcspdro stck  4-3.4.3 in order, 4.2-4.5 worst order
 * 			mcspdro-vcctx 4.8-7.0 in order, 5.3-6.7 worst order
 * 			can we see the 2 humps? 
 * 				mcspdr 1CL yes but less, varied, etc
 * 				mcspdr2 no
 *
 * 		test again with worst order with prefetchers enabled
 * 			mcspdr   1CL  3.8-4.0 in order, 2.6-2.7 worst order
 * 			mcspdr   2CL  4.2-4.4 in order, 3.8-3.9 worst order
 * 			mcspdr   4CL  4.5-5.2 in order, 4.0-4.2 worst order
 * 			mcspdr   8CL  4.4-5.1 in order, 4.3-4.7 worst order
 * 			mcspdr  16CL  4.4-4.8 in order, 4.4-5.3 worst order
 * 			mcspdr2 stck  3.0-3.0 in order, 2.9-3.0 worst order
 * 			mcspdro stck  4.2-4.3 in order, 4.2-4.4 worst order
 * 			mcspdro-vcctx 5.2-6.4 in order, 5.0-5.9 worst order
 * 			can we see the 2 humps?
 * 				mcspdrs 1CL yes, clearly
 * 				mcspdr2 no
 *
 * PROGRAM FEATURES
 * 		- verbosity?  vcoremap, preempts, the throughput and latency histograms?
 * 		- have a max workers option (0?) == max vcores
 * 		- would like to randomize (within bounds) the hold/delay times
 * 			- help avoid convoys with MCS locks
 *
 * PERFORMANCE:
 * 		pcore control?  (hyperthreading, core 0, cross socket?)
 * 			want some options for controlling which threads run where, or which
 * 			vcores are even used (like turning off hyperthreading)?
 * 		implement ticket spinlocks?  (more fair, more effects of preempts)
 * 			no simple way to do PDR either, other than 'check everyone'
 * 		MCS vs MCSPDR vs __MCSPDR
 * 			MCS seems slightly better than __MCSPDR (and it should)
 * 			MCSPDR is a bit worse than __MCSPDR
 * 				- the uth_disable/enable code seems to make a difference.
 * 				- i see why the latencies are worse, since they have extra work
 * 				to do, but the internal part that contends with other cores
 * 				shouldn't be affected, unless there's some other thing going on.
 * 				Or perhaps there isn't always someone waiting for the lock?
 * 				- faking VC ctx mostly negates the cost of MCSPDR vs __MCSPDR
 * 			things that made a big diff: CL aligning the qnodes, putting qnodes
 * 			on stacks, reading in the vcoreid once before ensuring()
 * 		both MCS CAS unlocks could use some branch prediction work
 * 		spinpdr locks are 2-3x faster than spinlocks...
 * 			test, test&set  vs the existing test&set, plus lots of asserts
 *
 * 		some delay (like 10us) lowers latency while maintaining throughput
 * 			- makes sense esp with MCS.  if you join the queue at the last
 * 			second, you'll measure lower latency than attempting right away
 * 			- also true for spinlocks
 * 			- we can probably figure out the max throughput (TP = f(delay)) for
 * 			each lock type
 *
 * 		hard to get steady numbers with MCS - different runs of the same test
 * 		will vary in throughput by around 15-30% (e.g., MCS varying from 3k-4k
 * 		L/ms)
 * 			- happens on c89 (NUMA) and hossin (UMA)
 * 			- spinlocks seem a little steadier.
 * 			- for MCS locks, the order in which they line up across the pcores
 * 			will matter.  like if on one run, i regularly hand off between cores
 * 			in the same socket and only do one cross-socket step
 * 			- run a lot of shorter ones to get a trend, for now
 * 			- might be correllated with spikes in held times (last bin)
 * 			- can't turn off legacy USB on c89 (SMM) - interferes with PXE
 *
 * PREEMPTS:
 * 		better preempt record tracking?
 * 			i just hacked some event-intercept and timestamp code together
 * 			maybe put it in the event library?
 * 			the timestamps definitely helped debugging
 *
 * 		is it true that if uthread code never spins outside a PDR lock, then it
 * 		doesn't need preemption IPIs?  (just someone checks the event at some
 * 		point). 
 * 			think so: so long as you make progress and when you aren't, you
 * 			check events (like if a uthread blocks on something and enters VC
 * 			ctx)
 * 		adjusting the number of workers, whether vcores or uthreads
 * 		- if you have more lockers than cores:
 * 			- spinpdr a worker will get starved (akaros) (without 2LS support)
 * 				- running this from uth context will cause a handle_events
 * 			- mcspdr will require the kernel to switch (akaros)
 * 			- spin (akaros) might DL (o/w nothing), (linux) poor perf
 * 			- mcs (akaros) will DL, (linux) poor perf
 * 			- poor perf (latency spikes) comes from running the wrong thread
 * 			sometimes
 * 			- deadlock comes from the lack of kernel-level context switching
 * 		- if we scale workers down to the number of active vcores:
 * 			- two things: the initial hit, and the steady state.  during the
 * 			initial hit, we can still deadlock, since we have more lockers than
 * 			cores
 * 				- non-pdr (akaros) could deadlock in the initial hit
 * 				- (akaros) steady state, everything is normal (just fewer cores)
 * 			- how can we adjust this in linux?
 * 				- if know how many cores you have, then futex wait the others
 * 				- need some way to wake them back up
 * 				- if you do this in userspace, you might need something PDR-like
 * 				to handle when the "2LS" code gets preempted
 * 			- as mentioned above, the problem in akaros is that the lock/unlock
 * 			might be happening too fast to get into the steady-state and recover
 * 			from the initial preemption
 * 		- one of our benefits is that we can adapt in userspace, with userspace
 * 		knowledge, under any circumstance.
 * 			- we have the deadlock windows (forcing PDR).
 * 			- in return, we can do this adaptation in userspace
 * 			- and (arguably) anyone who does this in userspace will need PDR
 *
 * MEASUREMENT (user/parlib/measure.c)
 * 		extract into its own library, for linux apps
 * 		print out raw TSC times?  might help sync up diff timelines
 * 		Need more latency bins, spinlocks vary too much
 * 		maybe we need better high/low too, since this hist looks bad too
 * 			or not center on the average?
 * 			for printing, its hard to know without already binning.
 * 			maybe bin once (latency?), then use that to adjust the hist?
 *
 * 		Had this on a spinlock:
 * 		[      32 -    35656] 1565231:
 * 		(less than 200 intermediate)
 * 	    [  286557 - 20404788]   65298: *
 *
 *		Samples per dot: 34782
 *		Total samples: 1640606
 *		Avg time   : 96658
 *		Stdev time : 604064.440882
 *		Coef Var   : 6.249503
 *			High coeff of var with serious outliers, adjusted bins
 *			50/75/90/99: 33079 / 33079 / 33079 / 290219 (-<860)
 *			Min / Max  : 32 / 20404788
 *		was 50/75/90 really within 860 of each other?
 *
 * 		when we are preempted and don't even attempt anything, say for 10ms, it
 * 		actually doesn't hurt our 50/75/90/99 too much.  we have a ridiculous
 * 		stddev and max, and high average, but there aren't any additional
 * 		attempts at locking to mess with the attempt-latency.  Only nr_vcores
 * 		requests are in flight during the preemption, but we can spit out around
 * 		5000 per ms when we aren't preempted.
 *
 */

const char *argp_program_version = "lock_test v0.1475263";
const char *argp_program_bug_address = "<akaros+subscribe@googlegroups.com>";

static char doc[] = "lock_test -- spinlock benchmarking";
static char args_doc[] = "-w NUM -l NUM -t LOCK";

#define OPT_VC_CTX 1
#define OPT_ADJ_WORKERS 2

static struct argp_option options[] = {
	{"workers",		'w', "NUM",	OPTION_NO_USAGE, "Number of threads/cores"},
	{0, 0, 0, 0, ""},
	{"loops",		'l', "NUM",	OPTION_NO_USAGE, "Number of loops per worker"},
	{0, 0, 0, 0, ""},
	{"type",		't', "LOCK",OPTION_NO_USAGE, "Type of lock to use.  "
	                                             "Options:\n"
	                                             "\tmcs\n"
	                                             "\tmcscas\n"
	                                             "\tmcspdr\n"
	                                             "\tmcspdro\n"
	                                             "\t__mcspdro\n"
	                                             "\tspin\n"
	                                             "\tspinpdr"},
	{0, 0, 0, 0, "Other options (not mandatory):"},
	{"adj_workers",	OPT_ADJ_WORKERS, 0,	0, "Adjust workers such that the "
	                                       "number of workers equals the "
	                                       "number of vcores"},
	{"vc_ctx",		OPT_VC_CTX, 0,	0, "Run threads in mock-vcore context"},
	{0, 0, 0, 0, ""},
	{"hold",		'h', "NSEC",	0, "nsec to hold the lock"},
	{"delay",		'd', "NSEC",	0, "nsec to delay between grabs"},
	{"print",		'p', "ROWS",	0, "Print ROWS of optional measurements"},
	{"outfile",		'o', "FILE",	0, "Print ROWS of optional measurements"},
	{ 0 }
};

struct prog_args {
	int							nr_threads;
	int							nr_loops;
	int							hold_time;
	int							delay_time;
	int							nr_print_rows;
	bool						fake_vc_ctx;
	bool						adj_workers;
	char						*outfile_path;
	void *(*lock_type)(void *arg);
};
struct prog_args pargs = {0};

/* Globals */
struct time_stamp {
	uint64_t pre;
	uint64_t acq;
	uint64_t un;
	bool valid;
};
struct time_stamp **times;
bool run_locktest = TRUE;
pthread_barrier_t start_test;

/* Locking functions.  Define globals here, init them in main (if possible), and
 * use the lock_func() macro to make your thread func. */

#define lock_func(lock_name, lock_cmd, unlock_cmd)                             \
void *lock_name##_thread(void *arg)                                            \
{                                                                              \
	long thread_id = (long)arg;                                                \
	int hold_time = ACCESS_ONCE(pargs.hold_time);                              \
	int delay_time = ACCESS_ONCE(pargs.delay_time);                            \
	int nr_loops = ACCESS_ONCE(pargs.nr_loops);                                \
	bool fake_vc_ctx = ACCESS_ONCE(pargs.fake_vc_ctx);                         \
	bool adj_workers = ACCESS_ONCE(pargs.adj_workers);                         \
	uint64_t pre_lock, acq_lock, un_lock;                                      \
	struct time_stamp *this_time;                                              \
	struct mcs_lock_qnode mcs_qnode = MCS_QNODE_INIT;                          \
	struct mcs_pdro_qnode pdro_qnode = MCSPDRO_QNODE_INIT;                     \
	int i;                                                                     \
	/* guessing a unique vcoreid for vcoreid for the __mcspdr test.  if the
	 * program gets preempted for that test, things may go nuts */             \
	pdro_qnode.vcoreid = thread_id + 1 % pargs.nr_threads;                     \
	/* Wait til all threads are created.  Ideally, I'd like to busywait unless
	 * absolutely critical to yield */                                         \
	pthread_barrier_wait(&start_test);                                         \
	if (fake_vc_ctx) {                                                         \
		/* tells the kernel / other vcores we're in vc ctx */                  \
		uth_disable_notifs();                                                  \
		/* tricks ourselves into believing we're in vc ctx */                  \
		__vcore_context = TRUE;                                                \
	}                                                                          \
	for (i = 0; i < nr_loops; i++) {                                           \
		if (!run_locktest)                                                     \
			break;                                                             \
		pre_lock = read_tsc_serialized();                                      \
                                                                               \
		lock_cmd                                                               \
                                                                               \
		acq_lock = read_tsc_serialized();                                      \
		if (hold_time)                                                         \
			ndelay(hold_time);                                                 \
                                                                               \
		unlock_cmd                                                             \
                                                                               \
		un_lock = read_tsc_serialized();                                       \
		this_time = &times[thread_id][i];                                      \
		this_time->pre = pre_lock;                                             \
		this_time->acq = acq_lock;                                             \
		this_time->un = un_lock;                                               \
		/* Can turn these on or off to control which samples we gather */      \
		this_time->valid = TRUE;                                               \
		/* this_time->valid = (num_vcores() == max_vcores());  */              \
                                                                               \
		if (delay_time)                                                        \
			ndelay(delay_time);                                                \
		/* worker thread ids are 0..n-1.  if we're one of the threads that's
		 * beyond the VC count, we yield. */                                   \
		if (adj_workers && num_vcores() < thread_id + 1) {                     \
			if (fake_vc_ctx) {                                                 \
				__vcore_context = FALSE;                                       \
				uth_enable_notifs();                                           \
			}                                                                  \
			/* we'll come back up once we have enough VCs running */           \
			pthread_yield();                                                   \
			if (fake_vc_ctx) {                                                 \
				uth_disable_notifs();                                          \
				__vcore_context = TRUE;                                        \
			}                                                                  \
		}                                                                      \
		cmb();                                                                 \
	}                                                                          \
	/* First thread to finish stops the test */                                \
	run_locktest = FALSE;                                                      \
	if (fake_vc_ctx) {                                                         \
		__vcore_context = FALSE;                                               \
		uth_enable_notifs();                                                   \
	}                                                                          \
	return (void*)(long)i;                                                     \
}

#define fake_lock_func(lock_name, x1, x2)                                      \
void *lock_name##_thread(void *arg)                                            \
{                                                                              \
	printf("Lock " #lock_name " not supported!\n");                            \
	exit(-1);                                                                  \
}

spinlock_t spin_lock = SPINLOCK_INITIALIZER;
struct mcs_lock mcs_lock = MCS_LOCK_INIT;

/* Defines locking funcs like "mcs_thread" */
lock_func(mcs,
          mcs_lock_lock(&mcs_lock, &mcs_qnode);,
          mcs_lock_unlock(&mcs_lock, &mcs_qnode);)
lock_func(mcscas,
          mcs_lock_lock(&mcs_lock, &mcs_qnode);,
          mcs_lock_unlock_cas(&mcs_lock, &mcs_qnode);)
lock_func(spin,
          spinlock_lock(&spin_lock);,
          spinlock_unlock(&spin_lock);)

#ifdef __ros__
struct spin_pdr_lock spdr_lock = SPINPDR_INITIALIZER;
struct mcs_pdr_lock mcspdr_lock;
struct mcs_pdro_lock mcspdro_lock = MCSPDRO_LOCK_INIT;

lock_func(mcspdr,
          mcs_pdr_lock(&mcspdr_lock);,
          mcs_pdr_unlock(&mcspdr_lock);)
lock_func(mcspdro,
          mcs_pdro_lock(&mcspdro_lock, &pdro_qnode);,
          mcs_pdro_unlock(&mcspdro_lock, &pdro_qnode);)
lock_func(__mcspdro,
          __mcs_pdro_lock(&mcspdro_lock, &pdro_qnode);,
          __mcs_pdro_unlock(&mcspdro_lock, &pdro_qnode);)
lock_func(spinpdr,
          spin_pdr_lock(&spdr_lock);,
          spin_pdr_unlock(&spdr_lock);)
#else

fake_lock_func(mcspdr, 0, 0);
fake_lock_func(mcspdro, 0, 0);
fake_lock_func(__mcspdro, 0, 0);
fake_lock_func(spinpdr, 0, 0);

#endif

static int get_acq_latency(void **data, int i, int j, uint64_t *sample)
{
	struct time_stamp **times = (struct time_stamp**)data;
	/* 0 for initial time means we didn't measure */
	if (times[i][j].pre == 0)
		return -1;
	/* can optionally throw out invalid times (keep this in sync with the
	 * lock_test macro, based on what you want to meaasure. */
	#if 0
	if (!times[i][j].valid)
		return -1;
	#endif
	*sample = times[i][j].acq - times[i][j].pre - get_tsc_overhead();
	return 0;
}

static int get_hld_latency(void **data, int i, int j, uint64_t *sample)
{
	struct time_stamp **times = (struct time_stamp**)data;
	/* 0 for initial time means we didn't measure */
	if (times[i][j].pre == 0)
		return -1;
	*sample = times[i][j].un - times[i][j].acq - get_tsc_overhead();
	return 0;
}

static int get_acq_timestamp(void **data, int i, int j, uint64_t *sample)
{
	struct time_stamp **times = (struct time_stamp**)data;
	/* 0 for initial time means we didn't measure */
	if (times[i][j].pre == 0)
		return -1;
	*sample = times[i][j].acq;
	return 0;
}

#ifdef __ros__

/* Lousy event intercept.  build something similar in the event library? */
#define MAX_NR_EVENT_TRACES 1000
uint64_t preempts[MAX_NR_EVENT_TRACES] = {0};
uint64_t indirs[MAX_NR_EVENT_TRACES] = {0};
atomic_t preempt_idx;
atomic_t indir_idx;
atomic_t preempt_cnt;
atomic_t indir_cnt;

static void trace_preempt(struct event_msg *ev_msg, unsigned int ev_type,
                          void *data)
{
	unsigned long my_slot = atomic_fetch_and_add(&preempt_idx, 1);
	if (my_slot < MAX_NR_EVENT_TRACES)
		preempts[my_slot] = read_tsc();
	atomic_inc(&preempt_cnt);
}

static void trace_indir(struct event_msg *ev_msg, unsigned int ev_type,
                        void *data)
{
	unsigned long my_slot = atomic_fetch_and_add(&indir_idx, 1);
	if (my_slot < MAX_NR_EVENT_TRACES)
		indirs[my_slot] = read_tsc();
	atomic_inc(&indir_cnt);
}

/* Helper, prints out the preempt trace */
static void print_preempt_trace(uint64_t starttsc, int nr_print_rows)
{
	/* reusing nr_print_rows for the nr preempt/indirs rows as well */
	int preempt_rows = MIN(MAX_NR_EVENT_TRACES, nr_print_rows);
	if (pargs.fake_vc_ctx) {
		printf("No preempt trace available when faking vc ctx\n");
		return;
	}
	printf("\n");
	printf("Nr Preempts: %d\n", atomic_read(&preempt_cnt));
	printf("Nr Indirs  : %d\n", atomic_read(&indir_cnt));
	if (preempt_rows)
		printf("Preempt/Indir events:\n-----------------\n");
	for (int i = 0; i < preempt_rows; i++) {
		if (preempts[i])
			printf("Preempt %3d at %6llu\n", i, tsc2msec(preempts[i]
			                                             - starttsc));
	}
	for (int i = 0; i < preempt_rows; i++) {
		if (indirs[i])
			printf("Indir   %3d at %6llu\n", i, tsc2msec(indirs[i]
			                                             - starttsc));
	}
}

/* Make sure we have enough VCs for nr_threads, pref 1:1 at the start */
static void os_prep_work(pthread_t *worker_threads, int nr_threads)
{
	if (nr_threads > max_vcores()) {
		printf("Too many threads (%d) requested, can't get more than %d vc\n",
		       nr_threads, max_vcores());
		exit(-1);
	}
	atomic_init(&preempt_idx, 0);
	atomic_init(&indir_idx, 0);
	atomic_init(&preempt_cnt, 0);
	atomic_init(&indir_cnt, 0);
	parlib_never_yield = TRUE;
	pthread_need_tls(FALSE);
	pthread_mcp_init();					/* gives us one vcore */
	register_ev_handler(EV_VCORE_PREEMPT, trace_preempt, 0);
	register_ev_handler(EV_CHECK_MSGS, trace_indir, 0);
	if (pargs.fake_vc_ctx) {
		/* need to disable events when faking vc ctx.  since we're looping and
		 * not handling events, we could run OOM */
		clear_kevent_q(EV_VCORE_PREEMPT);
		clear_kevent_q(EV_CHECK_MSGS);
	}
	vcore_request_total(nr_threads);
	parlib_never_vc_request = TRUE;
	for (int i = 0; i < nr_threads; i++) {
		printd("Vcore %d mapped to pcore %d\n", i,
		       __procinfo.vcoremap[i].pcoreid);
	}
}

static void os_post_work(pthread_t *worker_threads, int nr_threads)
{
}

#endif

/* Argument parsing */
static error_t parse_opt (int key, char *arg, struct argp_state *state)
{
	struct prog_args *pargs = state->input;
	switch (key) {
		case 'w':
			pargs->nr_threads = atoi(arg);
			if (pargs->nr_threads < 0) {
				printf("Negative nr_threads...\n\n");
				argp_usage(state);
			}
			break;
		case 'l':
			pargs->nr_loops = atoi(arg);
			if (pargs->nr_loops < 0) {
				printf("Negative nr_loops...\n\n");
				argp_usage(state);
			}
			break;
		case OPT_ADJ_WORKERS:
			pargs->adj_workers = TRUE;
			break;
		case OPT_VC_CTX:
			pargs->fake_vc_ctx = TRUE;
			break;
		case 'h':
			pargs->hold_time = atoi(arg);
			if (pargs->hold_time < 0) {
				printf("Negative hold_time...\n\n");
				argp_usage(state);
			}
			break;
		case 'd':
			pargs->delay_time = atoi(arg);
			if (pargs->delay_time < 0) {
				printf("Negative delay_time...\n\n");
				argp_usage(state);
			}
			break;
		case 'o':
			pargs->outfile_path = arg;
			break;
		case 'p':
			pargs->nr_print_rows = atoi(arg);
			if (pargs->nr_print_rows < 0) {
				printf("Negative print_rows...\n\n");
				argp_usage(state);
			}
			break;
		case 't':
			if (!strcmp("mcs", arg)) {
				pargs->lock_type = mcs_thread;
				break;
			}
			if (!strcmp("mcscas", arg)) {
				pargs->lock_type = mcscas_thread;
				break;
			}
			if (!strcmp("mcspdr", arg)) {
				pargs->lock_type = mcspdr_thread;
				break;
			}
			if (!strcmp("mcspdro", arg)) {
				pargs->lock_type = mcspdro_thread;
				break;
			}
			if (!strcmp("__mcspdro", arg)) {
				pargs->lock_type = __mcspdro_thread;
				break;
			}
			if (!strcmp("spin", arg)) {
				pargs->lock_type = spin_thread;
				break;
			}
			if (!strcmp("spinpdr", arg)) {
				pargs->lock_type = spinpdr_thread;
				break;
			}
			printf("Unknown locktype %s\n\n", arg);
			argp_usage(state);
			break;
		case ARGP_KEY_ARG:
			printf("Warning, extra argument %s ignored\n\n", arg);
			break;
		case ARGP_KEY_END:
			if (!pargs->nr_threads) {
				printf("Must select a number of threads.\n\n");
				argp_usage(state);
				break;
			}
			if (!pargs->nr_loops) {
				printf("Must select a number of loops.\n\n");
				argp_usage(state);
				break;
			}
			if (!pargs->lock_type) {
				printf("Must select a type of lock.\n\n");
				argp_usage(state);
				break;
			}
			break;
		default:
			return ARGP_ERR_UNKNOWN;
	}
	return 0;
}

static struct argp argp = {options, parse_opt, args_doc, doc};

int main(int argc, char** argv)
{
	pthread_t *worker_threads;
	void **loops_done;
	struct timeval start_tv = {0};
	struct timeval end_tv = {0};
	long usec_diff, total_loops = 0;
	uint64_t starttsc;
	int nr_threads, nr_loops;
	FILE *outfile;
	struct sample_stats acq_stats, hld_stats;

	argp_parse(&argp, argc, argv, 0, 0, &pargs);
	nr_threads = pargs.nr_threads;
	nr_loops = pargs.nr_loops;
	mcs_pdr_init(&mcspdr_lock);

	if (pargs.outfile_path) {
		/* RDWR, CREAT, TRUNC, O666 */
		outfile = fopen(pargs.outfile_path, "w+");
		if (!outfile) {
			perror("outfile");
			exit(-1);
		}
	}
	worker_threads = malloc(sizeof(pthread_t) * nr_threads);
	if (!worker_threads) {
		perror("pthread_t malloc failed:");
		exit(-1);
	}
	loops_done = malloc(sizeof(void*) * nr_threads);
	if (!loops_done) {
		perror("loops_done malloc failed");
		exit(-1);
	}
	printf("Making %d workers of %d loops each, %sadapting workers to vcores, "
	       "and %sfaking vcore context\n", nr_threads, nr_loops,
	       pargs.adj_workers ? "" : "not ",
	       pargs.fake_vc_ctx ? "" : "not ");
	pthread_barrier_init(&start_test, NULL, nr_threads);

	times = malloc(sizeof(struct time_stamp *) * nr_threads);
	assert(times);
	for (int i = 0; i < nr_threads; i++) {
		times[i] = malloc(sizeof(struct time_stamp) * nr_loops);
		if (!times[i]) {
			perror("Record keeping malloc");
			exit(-1);
		}
		memset(times[i], 0, sizeof(struct time_stamp) * nr_loops);
	}
	printf("Record tracking takes %ld bytes of memory\n",
	       nr_threads * nr_loops * sizeof(struct time_stamp));
	os_prep_work(worker_threads, nr_threads);	/* ensure we have enough VCs */
	/* Doing this in MCP ctx, so we might have been getting a few preempts
	 * already.  Want to read start before the threads pass their barrier */
	starttsc = read_tsc();
	/* create and join on yield */
	for (long i = 0; i < nr_threads; i++) {
		if (pthread_create(&worker_threads[i], NULL, pargs.lock_type,
		                   (void*)i))
			perror("pth_create failed");
	}
	os_post_work(worker_threads, nr_threads);
	if (gettimeofday(&start_tv, 0))
		perror("Start time error...");
	for (int i = 0; i < nr_threads; i++) {
		pthread_join(worker_threads[i], &loops_done[i]);
	}
	if (gettimeofday(&end_tv, 0))
		perror("End time error...");

	printf("Acquire times (TSC Ticks)\n---------------------------\n");
	acq_stats.get_sample = get_acq_latency;
	compute_stats((void**)times, nr_threads, nr_loops, &acq_stats);

	printf("Held times (from acq til rel done) (TSC Ticks)\n------\n");
	hld_stats.get_sample = get_hld_latency;
	compute_stats((void**)times, nr_threads, nr_loops, &hld_stats);

	usec_diff = (end_tv.tv_sec - start_tv.tv_sec) * 1000000 +
	            (end_tv.tv_usec - start_tv.tv_usec);
	printf("Time to run: %ld usec\n", usec_diff);

	printf("\nLock throughput:\n-----------------\n");
	/* throughput for the entire duration (in ms), 1ms steps.  print as many
	 * steps as they ask for (up to the end of the run). */
	print_throughput((void**)times, usec_diff / 1000 + 1, msec2tsc(1),
	                 pargs.nr_print_rows,
	                 starttsc, nr_threads,
	                 nr_loops, get_acq_timestamp);
	print_preempt_trace(starttsc, pargs.nr_print_rows);

	for (int i = 0; i < nr_threads; i++) {
		total_loops += (long)loops_done[i];
		if (!loops_done[i])
			printf("WARNING: thread %d performed 0 loops!\n", i);
	}
	printf("Average number of loops done, per thread: %ld\n",
	       total_loops / nr_threads);
	for (int i = 0; i < nr_threads; i++)
		printf("\tThread %d performed %lu loops\n", i, (long)loops_done[i]);

	if (pargs.outfile_path) {
		fprintf(outfile, "#");
		for (char **arg = argv; *arg; arg++)
			fprintf(outfile, " %s", *arg);
		fprintf(outfile, "\n");
		fprintf(outfile, "# thread_id attempt pre acq(uire) un(lock) "
		                 "tsc_overhead\n");
		fprintf(outfile, "# acquire latency: acq - pre - tsc_overhead\n");
		fprintf(outfile, "# hold time: un - acq - tsc_overhead\n");
		fprintf(outfile, "# tsc_frequency %llu\n", get_tsc_freq());
		fprintf(outfile, "# tsc_overhead is 0 on linux, hard code it with a "
		                 "value from akaros\n");
		for (int i = 0; i < nr_threads; i++) {
			for (int j = 0; j < nr_loops; j++) {
				struct time_stamp *ts = &times[i][j];
				if (!ts->pre)
					break; /* empty record */
				fprintf(outfile, "%d %d %llu %llu %llu %llu\n", i, j, ts->pre,
				        ts->acq, ts->un, get_tsc_overhead());
			}
		}
		fclose(outfile);
	}
	printf("Done, exiting\n");
}
