
__always_inline uint64_t ns_get(void)
{
	struct timespec ts;

	clock_gettime(CLOCK_MONOTONIC, &ts);
	return (ts.tv_sec * 1000000000ULL + ts.tv_nsec);
}

/* RAF: this function is multi-threading compatible when extvar != NULL;
 *
 *	ATTENTION: It is affected by (NTP) adjustments for clock drift. 
 */

uint64_t ns_elapsed(uint64_t *extvar)
{
	static uint64_t start = (uint64_t)(-1);
	uint64_t stop, time = 1; //RAF: return at least 1 ns
	
	if(extvar != NULL)
		start = *extvar;

	stop = ns_get();
	if(stop > start) {
		time = stop - start;
	} else if(stop < start) { //RAF: overflow
		time = (uint64_t)(-1) - start + 1 + stop;
	}
	start = stop;

	if(extvar != NULL)
		*extvar = start;

	return time;
}
