diff options
| author | Russ Cox <rsc@golang.org> | 2009-06-04 11:16:03 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-06-04 11:16:03 -0700 |
| commit | 3a0df4c451b1db1eb8ab178d4cd2522496bc892d (patch) | |
| tree | 93ccc52d7ec8faec7c4604dee258e7bbc7d8165e /src/lib | |
| parent | f51ca384eba74692315b51b1db99d412f4472e17 (diff) | |
| download | go-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.go | 23 | ||||
| -rw-r--r-- | src/lib/syscall/asm_darwin_386.s | 2 | ||||
| -rw-r--r-- | src/lib/syscall/syscall_darwin_386.go | 9 | ||||
| -rw-r--r-- | src/lib/syscall/syscall_darwin_amd64.go | 5 |
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); +} |
