aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-06-04 11:16:03 -0700
committerRuss Cox <rsc@golang.org>2009-06-04 11:16:03 -0700
commit3a0df4c451b1db1eb8ab178d4cd2522496bc892d (patch)
tree93ccc52d7ec8faec7c4604dee258e7bbc7d8165e /src/lib
parentf51ca384eba74692315b51b1db99d412f4472e17 (diff)
downloadgo-3a0df4c451b1db1eb8ab178d4cd2522496bc892d.tar.xz
more 386 runtime fixes.
can pass many tests; current stumbling block is an 8l bug. R=r DELTA=122 (83 added, 8 deleted, 31 changed) OCL=29872 CL=29876
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/net/fd_darwin.go23
-rw-r--r--src/lib/syscall/asm_darwin_386.s2
-rw-r--r--src/lib/syscall/syscall_darwin_386.go9
-rw-r--r--src/lib/syscall/syscall_darwin_amd64.go5
4 files changed, 23 insertions, 16 deletions
diff --git a/src/lib/net/fd_darwin.go b/src/lib/net/fd_darwin.go
index 3d1025d516..42bf512210 100644
--- a/src/lib/net/fd_darwin.go
+++ b/src/lib/net/fd_darwin.go
@@ -31,7 +31,7 @@ func newpollster() (p *pollster, err os.Error) {
}
func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
- var kmode int16;
+ var kmode int;
if mode == 'r' {
kmode = syscall.EVFILT_READ
} else {
@@ -39,23 +39,21 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
}
var events [1]syscall.Kevent_t;
ev := &events[0];
- ev.Ident = uint64(fd);
- ev.Filter = kmode;
-
// EV_ADD - add event to kqueue list
// EV_RECEIPT - generate fake EV_ERROR as result of add,
// rather than waiting for real event
// EV_ONESHOT - delete the event the first time it triggers
- ev.Flags = syscall.EV_ADD | syscall.EV_RECEIPT;
+ flags := syscall.EV_ADD | syscall.EV_RECEIPT;
if !repeat {
- ev.Flags |= syscall.EV_ONESHOT
+ flags |= syscall.EV_ONESHOT
}
+ syscall.SetKevent(ev, fd, kmode, flags);
n, e := syscall.Kevent(p.kq, &events, &events, nil);
if e != 0 {
return os.ErrnoToError(e)
}
- if n != 1 || (ev.Flags & syscall.EV_ERROR) == 0 || ev.Ident != uint64(fd) || ev.Filter != kmode {
+ if n != 1 || (ev.Flags & syscall.EV_ERROR) == 0 || int(ev.Ident) != fd || int(ev.Filter) != kmode {
return kqueuePhaseError
}
if ev.Data != 0 {
@@ -65,7 +63,7 @@ func (p *pollster) AddFD(fd int, mode int, repeat bool) os.Error {
}
func (p *pollster) DelFD(fd int, mode int) {
- var kmode int16;
+ var kmode int;
if mode == 'r' {
kmode = syscall.EVFILT_READ
} else {
@@ -73,13 +71,10 @@ func (p *pollster) DelFD(fd int, mode int) {
}
var events [1]syscall.Kevent_t;
ev := &events[0];
- ev.Ident = uint64(fd);
- ev.Filter = kmode;
-
// EV_DELETE - delete event from kqueue list
// EV_RECEIPT - generate fake EV_ERROR as result of add,
// rather than waiting for real event
- ev.Flags = syscall.EV_DELETE | syscall.EV_RECEIPT;
+ syscall.SetKevent(ev, fd, kmode, syscall.EV_DELETE | syscall.EV_RECEIPT);
syscall.Kevent(p.kq, &events, &events, nil);
}
@@ -90,9 +85,7 @@ func (p *pollster) WaitFD(nsec int64) (fd int, mode int, err os.Error) {
if t == nil {
t = new(syscall.Timespec);
}
- t.Sec = nsec / 1e9;
- t.Nsec = int64(nsec % 1e9);
-// *t = syscall.NsecToTimespec(nsec);
+ *t = syscall.NsecToTimespec(nsec);
}
nn, e := syscall.Kevent(p.kq, nil, &p.eventbuf, t);
if e != 0 {
diff --git a/src/lib/syscall/asm_darwin_386.s b/src/lib/syscall/asm_darwin_386.s
index 7fb90c28a5..a8ec5b00cf 100644
--- a/src/lib/syscall/asm_darwin_386.s
+++ b/src/lib/syscall/asm_darwin_386.s
@@ -48,7 +48,7 @@ TEXT syscall·Syscall6(SB),7,$0
MOVSL
MOVSL
INT $0x80
- JAE ok
+ JAE ok6
MOVL $-1, 32(SP) // r1
MOVL $-1, 36(SP) // r2
MOVL AX, 40(SP) // errno
diff --git a/src/lib/syscall/syscall_darwin_386.go b/src/lib/syscall/syscall_darwin_386.go
index 6f82e04e48..5633d7c034 100644
--- a/src/lib/syscall/syscall_darwin_386.go
+++ b/src/lib/syscall/syscall_darwin_386.go
@@ -6,6 +6,10 @@ package syscall
import "syscall"
+func Getpagesize() int {
+ return 4096
+}
+
func TimespecToNsec(ts Timespec) int64 {
return int64(ts.Sec)*1e9 + int64(ts.Nsec);
}
@@ -38,3 +42,8 @@ func Gettimeofday(tv *Timeval) (errno int) {
return err;
}
+func SetKevent(k *Kevent_t, fd, mode, flags int) {
+ k.Ident = uint32(fd);
+ k.Filter = int16(mode);
+ k.Flags = uint16(flags);
+}
diff --git a/src/lib/syscall/syscall_darwin_amd64.go b/src/lib/syscall/syscall_darwin_amd64.go
index 8620232230..f7a93f1216 100644
--- a/src/lib/syscall/syscall_darwin_amd64.go
+++ b/src/lib/syscall/syscall_darwin_amd64.go
@@ -42,3 +42,8 @@ func Gettimeofday(tv *Timeval) (errno int) {
return err;
}
+func SetKevent(k *Kevent_t, fd, mode, flags int) {
+ k.Ident = uint64(fd);
+ k.Filter = int16(mode);
+ k.Flags = uint16(flags);
+}