aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Martin <ality@pbrane.org>2011-11-17 22:09:28 -0500
committerRuss Cox <rsc@golang.org>2011-11-17 22:09:28 -0500
commit4a2d30e13bf6f52e51c347d562871648bf5ef3bb (patch)
tree4896b27ae45ed3a8f5bcf5eca7b478ec10f242f1
parentf6279b46f8220a90fb5bcadcfc8cdbe3eedd7cf2 (diff)
downloadgo-4a2d30e13bf6f52e51c347d562871648bf5ef3bb.tar.gz
go-4a2d30e13bf6f52e51c347d562871648bf5ef3bb.zip
runtime: add nanotime for Plan 9
R=paulzhol, rsc, dave, rminnich CC=golang-dev https://golang.org/cl/5327063
-rw-r--r--src/pkg/runtime/plan9/386/signal.c6
-rw-r--r--src/pkg/runtime/plan9/386/sys.s18
-rw-r--r--src/pkg/runtime/plan9/os.h13
-rw-r--r--src/pkg/runtime/plan9/thread.c40
4 files changed, 58 insertions, 19 deletions
diff --git a/src/pkg/runtime/plan9/386/signal.c b/src/pkg/runtime/plan9/386/signal.c
index 77e40d35a9..c0b759c713 100644
--- a/src/pkg/runtime/plan9/386/signal.c
+++ b/src/pkg/runtime/plan9/386/signal.c
@@ -4,12 +4,6 @@
#include "runtime.h"
-int64
-runtime·nanotime(void)
-{
- // Won't compile.
-}
-
String
runtime·signame(int32)
{
diff --git a/src/pkg/runtime/plan9/386/sys.s b/src/pkg/runtime/plan9/386/sys.s
index a15362ff70..97be276be6 100644
--- a/src/pkg/runtime/plan9/386/sys.s
+++ b/src/pkg/runtime/plan9/386/sys.s
@@ -14,16 +14,14 @@ TEXT runtime·open(SB),7,$0
INT $64
RET
-// TODO(ality): remove use of deprecated system calls
-
-TEXT runtime·read(SB),7,$0
- MOVL $15, AX
- INT $64
+TEXT runtime·pread(SB),7,$0
+ MOVL $50, AX
+ INT $64
RET
-TEXT runtime·write(SB),7,$0
- MOVL $20, AX
- INT $64
+TEXT runtime·pwrite(SB),7,$0
+ MOVL $51, AX
+ INT $64
RET
TEXT runtime·close(SB),7,$0
@@ -90,9 +88,9 @@ TEXT runtime·rfork(SB),7,$0
MOVL 0(BX), BX
// more paranoia; check that stack splitting code works
- PUSHAL
+ PUSHL SI
CALL runtime·emptyfunc(SB)
- POPAL
+ POPL SI
CALL SI // fn()
CALL runtime·exit(SB)
diff --git a/src/pkg/runtime/plan9/os.h b/src/pkg/runtime/plan9/os.h
index dcbdab25a9..b7b8383494 100644
--- a/src/pkg/runtime/plan9/os.h
+++ b/src/pkg/runtime/plan9/os.h
@@ -4,6 +4,8 @@
// Plan 9-specific system calls
int32 runtime·open(uint8 *file, int32 mode);
+int32 runtime·pread(int32 fd, void *buf, int32 nbytes, int64 offset);
+int32 runtime·pwrite(int32 fd, void *buf, int32 nbytes, int64 offset);
int32 runtime·read(int32 fd, void *buf, int32 nbytes);
int32 runtime·close(int32 fd);
void runtime·exits(int8* msg);
@@ -16,9 +18,14 @@ int32 runtime·plan9_semrelease(uint32 *addr, int32 count);
/* open */
enum
{
- OREAD = 0,
- OWRITE = 1,
- ORDWR = 2
+ OREAD = 0,
+ OWRITE = 1,
+ ORDWR = 2,
+ OEXEC = 3,
+ OTRUNC = 16,
+ OCEXEC = 32,
+ ORCLOSE = 64,
+ OEXCL = 0x1000
};
/* rfork */
diff --git a/src/pkg/runtime/plan9/thread.c b/src/pkg/runtime/plan9/thread.c
index 8ad06ca1e4..87ea8a2363 100644
--- a/src/pkg/runtime/plan9/thread.c
+++ b/src/pkg/runtime/plan9/thread.c
@@ -69,6 +69,34 @@ runtime·usleep(uint32 µs)
runtime·sleep(ms);
}
+int64
+runtime·nanotime(void)
+{
+ static int32 fd = -1;
+ byte b[8];
+ uint32 hi, lo;
+
+ // As long as all goroutines share the same file
+ // descriptor table we can get away with using
+ // just a static fd. Without a lock the file can
+ // be opened twice but that's okay.
+ //
+ // Using /dev/bintime gives us a latency on the
+ // order of ten microseconds between two calls.
+ //
+ // The naïve implementation (without the cached
+ // file descriptor) is roughly four times slower
+ // in 9vx on a 2.16 GHz Intel Core 2 Duo.
+
+ if(fd < 0 && (fd = runtime·open((byte*)"/dev/bintime", OREAD|OCEXEC)) < 0)
+ return 0;
+ if(runtime·pread(fd, b, sizeof b, 0) != sizeof b)
+ return 0;
+ hi = b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3];
+ lo = b[4]<<24 | b[5]<<16 | b[6]<<8 | b[7];
+ return (int64)hi<<32 | (int64)lo;
+}
+
extern Tos *_tos;
void
runtime·exit(int32)
@@ -183,3 +211,15 @@ void
runtime·sigpanic(void)
{
}
+
+int32
+runtime·read(int32 fd, void *buf, int32 nbytes)
+{
+ return runtime·pread(fd, buf, nbytes, -1LL);
+}
+
+int32
+runtime·write(int32 fd, void *buf, int32 nbytes)
+{
+ return runtime·pwrite(fd, buf, nbytes, -1LL);
+}