shithub: orca

Download patch

ref: b70bc705d1a4ecfe686d01f11a2bdb60234f8ca5
parent: febae883471be38061bc211929836ceae47744b4
author: Sigrid Haflínudóttir <ftrvxmtrx@gmail.com>
date: Sat Aug 1 15:19:33 EDT 2020

plan9: use _tos->cyclefreq instead of reading /dev/time

--- a/plan9.c
+++ b/plan9.c
@@ -9,6 +9,7 @@
 #include <thread.h>
 #include <plumb.h>
 #include <cursor.h>
+#include <tos.h>
 
 #define MIN(x,y) ((x)<=(y)?(x):(y))
 #define MAX(x,y) ((x)>=(y)?(x):(y))
@@ -517,41 +518,21 @@
  * 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
- *
- * "fasthz" is how many ticks there are in a second
- * can be read from /dev/time
- *
- * perhaps using RDTSCP is even better
  */
-static uvlong
+uvlong
 nanosec(void)
 {
 	static uvlong fasthz, xstart;
 	uvlong x, div;
-	int f, n, i;
-	char tmp[128], *e;
 
-	if (fasthz == ~0ULL)
+	if(fasthz == ~0ULL)
 		return nsec() - xstart;
 
-	if (fasthz == 0) {
-		fasthz = ~0ULL;
+	if(fasthz == 0){
 		xstart = nsec();
-		if (usensec)
-			return 0;
-		if ((f = open("/dev/time", OREAD)) >= 0 && (n = read(f, tmp, sizeof(tmp)-1)) > 2) {
-			tmp[n] = 0;
-			e = tmp;
-			for (i = 0; i < 3; i++)
-				strtoll(e, &e, 10);
-			if ((fasthz = strtoll(e, nil, 10)) < 1)
-				fasthz = ~0ULL;
-			else
-				cycles(&xstart);
-		}
-		close(f);
-		if (fasthz == ~0ULL) {
-			fprint(2, "couldn't get fasthz, falling back to nsec()\n");
+		if((fasthz = _tos->cyclefreq) == 0){
+			fasthz = ~0ULL;
+			fprint(2, "cyclefreq not available, falling back to nsec()\n");
 			fprint(2, "you might want to disable aux/timesync\n");
 			return 0;
 		}
@@ -559,7 +540,8 @@
 	cycles(&x);
 	x -= xstart;
 
-	for (div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
+	/* this is ugly */
+	for(div = 1000000000ULL; x < 0x1999999999999999ULL && div > 1 ; div /= 10ULL, x *= 10ULL);
 
 	return x / (fasthz / div);
 }