shithub: npe

ref: fd731d3c833d9241fdff618b6c949453fb5c0f31
dir: /plan9.c/

View raw version
#include "plan9.h"
#include <thread.h>
#include <tos.h>
#include <pool.h>

int mainstacksize = 32*1024;

int
rm_r(char *dir)
{
	int pid;

	if((pid = rfork(RFPROC|RFFDG|RFNOTEG|RFCENVG|RFNOWAIT)) == 0){
		execl("/bin/rm", "rm", "-r", dir, nil);
		sysfatal("execl: %r");
	}

	return pid < 0 ? -1 : 0;
}

/*
 * nsec() is wallclock and can be adjusted by timesync
 * so need to use cycles() instead, but fall back to
 * nsec() in case we can't
 */
uvlong
nanosec(void)
{
	static uvlong fasthz, xstart;
	uvlong x, div;

	if(fasthz == ~0ULL)
		return nsec() - xstart;

	if(fasthz == 0){
		if(_tos->cyclefreq){
			cycles(&xstart);
			fasthz = _tos->cyclefreq;
		} else {
			xstart = nsec();
			fasthz = ~0ULL;
			fprint(2, "cyclefreq not available, falling back to nsec()\n");
			fprint(2, "you might want to disable aux/timesync\n");
			return 0;
		}
	}
	cycles(&x);
	x -= xstart;

	/* this is ugly */
	for(div = NSEC; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);

	return x / (fasthz / div);
}

void
nsleep(uvlong ns)
{
	uvlong start, end;

	start = nanosec();
	end = start + ns;
	ns = start;
	do{
		if(end - ns > 750000000ULL)
			sleep(70);
		else if (end - ns > 25000000ULL)
			sleep(20);
		else if (end - ns > 10000000ULL)
			sleep(1);
		else
			break;
		ns = nanosec();
	}while(ns < end);
}

void
threadmain(int argc, char **argv)
{
	int __main(int argc, char *argv[]);

	setfcr(getfcr() & ~(FPINVAL|FPOVFL));
	//mainmem->flags |= POOL_PARANOIA | POOL_ANTAGONISM;

	threadexitsall(__main(argc, argv) == 0 ? nil : "error");
}