ref: fd731d3c833d9241fdff618b6c949453fb5c0f31
dir: /plan9.c/
#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"); }