Commit 0d9c1abb authored by Russ Cox's avatar Russ Cox

replace assembly casts with unsafe.pointer

R=r
DELTA=178  (18 added, 101 deleted, 59 changed)
OCL=20822
CL=20826
parent f58567d6
...@@ -7,7 +7,8 @@ package net ...@@ -7,7 +7,8 @@ package net
import ( import (
"os"; "os";
"syscall"; "syscall";
"net" "net";
"unsafe";
) )
export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
...@@ -23,7 +24,7 @@ export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os. ...@@ -23,7 +24,7 @@ export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.
for i := 0; i < IPv4len; i++ { for i := 0; i < IPv4len; i++ {
sa.addr[i] = p[i] sa.addr[i] = p[i]
} }
return syscall.SockaddrInet4ToSockaddr(sa), nil return unsafe.pointer(sa).(*syscall.Sockaddr), nil
} }
export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
...@@ -39,20 +40,20 @@ export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os. ...@@ -39,20 +40,20 @@ export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.
for i := 0; i < IPv6len; i++ { for i := 0; i < IPv6len; i++ {
sa.addr[i] = p[i] sa.addr[i] = p[i]
} }
return syscall.SockaddrInet6ToSockaddr(sa), nil return unsafe.pointer(sa).(*syscall.Sockaddr), nil
} }
export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) { export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) {
switch sa1.family { switch sa1.family {
case syscall.AF_INET: case syscall.AF_INET:
sa := syscall.SockaddrToSockaddrInet4(sa1); sa := unsafe.pointer(sa1).(*syscall.SockaddrInet4);
a := ToIPv6(&sa.addr); a := ToIPv6(&sa.addr);
if a == nil { if a == nil {
return nil, 0, os.EINVAL return nil, 0, os.EINVAL
} }
return a, int(sa.port[0])<<8 + int(sa.port[1]), nil; return a, int(sa.port[0])<<8 + int(sa.port[1]), nil;
case syscall.AF_INET6: case syscall.AF_INET6:
sa := syscall.SockaddrToSockaddrInet6(sa1); sa := unsafe.pointer(sa1).(*syscall.SockaddrInet6);
a := ToIPv6(&sa.addr); a := ToIPv6(&sa.addr);
if a == nil { if a == nil {
return nil, 0, os.EINVAL return nil, 0, os.EINVAL
......
...@@ -7,7 +7,8 @@ package net ...@@ -7,7 +7,8 @@ package net
import ( import (
"os"; "os";
"syscall"; "syscall";
"net" "net";
"unsafe";
) )
export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) { export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
...@@ -22,7 +23,7 @@ export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os. ...@@ -22,7 +23,7 @@ export func IPv4ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.
for i := 0; i < IPv4len; i++ { for i := 0; i < IPv4len; i++ {
sa.addr[i] = p[i] sa.addr[i] = p[i]
} }
return syscall.SockaddrInet4ToSockaddr(sa), nil return unsafe.pointer(sa).(*syscall.Sockaddr), nil
} }
var IPv6zero [16]byte; var IPv6zero [16]byte;
...@@ -47,20 +48,20 @@ export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os. ...@@ -47,20 +48,20 @@ export func IPv6ToSockaddr(p *[]byte, port int) (sa1 *syscall.Sockaddr, err *os.
for i := 0; i < IPv6len; i++ { for i := 0; i < IPv6len; i++ {
sa.addr[i] = p[i] sa.addr[i] = p[i]
} }
return syscall.SockaddrInet6ToSockaddr(sa), nil return unsafe.pointer(sa).(*syscall.Sockaddr), nil
} }
export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) { export func SockaddrToIP(sa1 *syscall.Sockaddr) (p *[]byte, port int, err *os.Error) {
switch sa1.family { switch sa1.family {
case syscall.AF_INET: case syscall.AF_INET:
sa := syscall.SockaddrToSockaddrInet4(sa1); sa := unsafe.pointer(sa1).(*syscall.SockaddrInet4);
a := ToIPv6(&sa.addr); a := ToIPv6(&sa.addr);
if a == nil { if a == nil {
return nil, 0, os.EINVAL return nil, 0, os.EINVAL
} }
return a, int(sa.port[0])<<8 + int(sa.port[1]), nil; return a, int(sa.port[0])<<8 + int(sa.port[1]), nil;
case syscall.AF_INET6: case syscall.AF_INET6:
sa := syscall.SockaddrToSockaddrInet6(sa1); sa := unsafe.pointer(sa1).(*syscall.SockaddrInet6);
a := ToIPv6(&sa.addr); a := ToIPv6(&sa.addr);
if a == nil { if a == nil {
return nil, 0, os.EINVAL return nil, 0, os.EINVAL
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
# DO NOT EDIT. Automatically generated by gobuild. # DO NOT EDIT. Automatically generated by gobuild.
# gobuild -m errstr_darwin.go file_darwin.go socket_darwin.go\ # gobuild -m errstr_darwin.go file_darwin.go socket_darwin.go\
# syscall_amd64_darwin.go time_amd64_darwin.go types_amd64_darwin.go\ # syscall_amd64_darwin.go time_amd64_darwin.go types_amd64_darwin.go\
# asm_amd64_darwin.s cast_amd64.s syscall.go signal_amd64_darwin.go >Makefile # asm_amd64_darwin.s syscall.go signal_amd64_darwin.go >Makefile
O=6 O=6
GC=$(O)g GC=$(O)g
CC=$(O)c -w CC=$(O)c -w
...@@ -38,7 +38,6 @@ O1=\ ...@@ -38,7 +38,6 @@ O1=\
syscall_$(GOARCH)_$(GOOS).$O\ syscall_$(GOARCH)_$(GOOS).$O\
types_$(GOARCH)_$(GOOS).$O\ types_$(GOARCH)_$(GOOS).$O\
asm_$(GOARCH)_$(GOOS).$O\ asm_$(GOARCH)_$(GOOS).$O\
cast_$(GOARCH).$O\
syscall.$O\ syscall.$O\
signal_$(GOARCH)_$(GOOS).$O\ signal_$(GOARCH)_$(GOOS).$O\
...@@ -50,7 +49,7 @@ O2=\ ...@@ -50,7 +49,7 @@ O2=\
syscall.a: a1 a2 syscall.a: a1 a2
a1: $(O1) a1: $(O1)
$(AR) grc syscall.a errstr_$(GOOS).$O syscall_$(GOARCH)_$(GOOS).$O types_$(GOARCH)_$(GOOS).$O asm_$(GOARCH)_$(GOOS).$O cast_$(GOARCH).$O syscall.$O signal_$(GOARCH)_$(GOOS).$O $(AR) grc syscall.a errstr_$(GOOS).$O syscall_$(GOARCH)_$(GOOS).$O types_$(GOARCH)_$(GOOS).$O asm_$(GOARCH)_$(GOOS).$O syscall.$O signal_$(GOARCH)_$(GOOS).$O
rm -f $(O1) rm -f $(O1)
a2: $(O2) a2: $(O2)
......
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// conversion operators - really just casts
TEXT syscall·BytePtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·BytePtrPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·Int32Ptr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·Int64Ptr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·KeventPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·EpollEventPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·LingerPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·SockaddrPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·StatPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·TimespecPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·TimevalPtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·RusagePtr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·SockaddrToSockaddrInet4(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·SockaddrToSockaddrInet6(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·SockaddrInet4ToSockaddr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
TEXT syscall·SockaddrInet6ToSockaddr(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
...@@ -2,11 +2,14 @@ ...@@ -2,11 +2,14 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
package syscall
// File operations for Darwin // File operations for Darwin
import syscall "syscall" package syscall
import (
"syscall";
"unsafe";
)
const NameBufsize = 512 const NameBufsize = 512
...@@ -15,7 +18,7 @@ export func open(name string, mode int64, perm int64) (ret int64, errno int64) { ...@@ -15,7 +18,7 @@ export func open(name string, mode int64, perm int64) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_OPEN, BytePtr(&namebuf[0]), mode, perm); r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.pointer(&namebuf[0]))), mode, perm);
return r1, err; return r1, err;
} }
...@@ -24,7 +27,7 @@ export func creat(name string, perm int64) (ret int64, errno int64) { ...@@ -24,7 +27,7 @@ export func creat(name string, perm int64) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_OPEN, BytePtr(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm); r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.pointer(&namebuf[0]))), O_CREAT|O_WRONLY|O_TRUNC, perm);
return r1, err; return r1, err;
} }
...@@ -34,12 +37,12 @@ export func close(fd int64) (ret int64, errno int64) { ...@@ -34,12 +37,12 @@ export func close(fd int64) (ret int64, errno int64) {
} }
export func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { export func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_READ, fd, BytePtr(buf), nbytes); r1, r2, err := Syscall(SYS_READ, fd, int64(uintptr(unsafe.pointer(buf))), nbytes);
return r1, err; return r1, err;
} }
export func write(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { export func write(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_WRITE, fd, BytePtr(buf), nbytes); r1, r2, err := Syscall(SYS_WRITE, fd, int64(uintptr(unsafe.pointer(buf))), nbytes);
return r1, err; return r1, err;
} }
...@@ -58,17 +61,17 @@ export func stat(name string, buf *Stat) (ret int64, errno int64) { ...@@ -58,17 +61,17 @@ export func stat(name string, buf *Stat) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_STAT64, BytePtr(&namebuf[0]), StatPtr(buf), 0); r1, r2, err := Syscall(SYS_STAT64, int64(uintptr(unsafe.pointer(&namebuf[0]))), int64(uintptr(unsafe.pointer(buf))), 0);
return r1, err; return r1, err;
} }
export func lstat(name *byte, buf *Stat) (ret int64, errno int64) { export func lstat(name *byte, buf *Stat) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_LSTAT, BytePtr(name), StatPtr(buf), 0); r1, r2, err := Syscall(SYS_LSTAT, int64(uintptr(unsafe.pointer(name))), int64(uintptr(unsafe.pointer(buf))), 0);
return r1, err; return r1, err;
} }
export func fstat(fd int64, buf *Stat) (ret int64, errno int64) { export func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_FSTAT, fd, StatPtr(buf), 0); r1, r2, err := Syscall(SYS_FSTAT, fd, int64(uintptr(unsafe.pointer(buf))), 0);
return r1, err; return r1, err;
} }
...@@ -77,7 +80,7 @@ export func unlink(name string) (ret int64, errno int64) { ...@@ -77,7 +80,7 @@ export func unlink(name string) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_UNLINK, BytePtr(&namebuf[0]), 0, 0); r1, r2, err := Syscall(SYS_UNLINK, int64(uintptr(unsafe.pointer(&namebuf[0]))), 0, 0);
return r1, err; return r1, err;
} }
...@@ -91,7 +94,7 @@ export func mkdir(name string, perm int64) (ret int64, errno int64) { ...@@ -91,7 +94,7 @@ export func mkdir(name string, perm int64) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_MKDIR, BytePtr(&namebuf[0]), perm, 0); r1, r2, err := Syscall(SYS_MKDIR, int64(uintptr(unsafe.pointer(&namebuf[0]))), perm, 0);
return r1, err; return r1, err;
} }
......
...@@ -6,7 +6,10 @@ package syscall ...@@ -6,7 +6,10 @@ package syscall
// File operations for Linux // File operations for Linux
import syscall "syscall" import (
"syscall";
"unsafe";
)
const NameBufsize = 512 const NameBufsize = 512
...@@ -15,7 +18,7 @@ export func open(name string, mode int64, perm int64) (ret int64, errno int64) { ...@@ -15,7 +18,7 @@ export func open(name string, mode int64, perm int64) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_OPEN, BytePtr(&namebuf[0]), mode, perm); r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.pointer(&namebuf[0]))), mode, perm);
return r1, err; return r1, err;
} }
...@@ -24,7 +27,7 @@ export func creat(name string, perm int64) (ret int64, errno int64) { ...@@ -24,7 +27,7 @@ export func creat(name string, perm int64) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_OPEN, BytePtr(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm); r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.pointer(&namebuf[0]))), O_CREAT|O_WRONLY|O_TRUNC, perm);
return r1, err; return r1, err;
} }
...@@ -34,18 +37,18 @@ export func close(fd int64) (ret int64, errno int64) { ...@@ -34,18 +37,18 @@ export func close(fd int64) (ret int64, errno int64) {
} }
export func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { export func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_READ, fd, BytePtr(buf), nbytes); r1, r2, err := Syscall(SYS_READ, fd, int64(uintptr(unsafe.pointer(buf))), nbytes);
return r1, err; return r1, err;
} }
export func write(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { export func write(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_WRITE, fd, BytePtr(buf), nbytes); r1, r2, err := Syscall(SYS_WRITE, fd, int64(uintptr(unsafe.pointer(buf))), nbytes);
return r1, err; return r1, err;
} }
export func pipe(fds *[2]int64) (ret int64, errno int64) { export func pipe(fds *[2]int64) (ret int64, errno int64) {
var t [2] int32; var t [2] int32;
r1, r2, err := Syscall(SYS_PIPE, Int32Ptr(&t[0]), 0, 0); r1, r2, err := Syscall(SYS_PIPE, int64(uintptr(unsafe.pointer(&t[0]))), 0, 0);
if r1 < 0 { if r1 < 0 {
return r1, err; return r1, err;
} }
...@@ -59,17 +62,17 @@ export func stat(name string, buf *Stat) (ret int64, errno int64) { ...@@ -59,17 +62,17 @@ export func stat(name string, buf *Stat) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_STAT, BytePtr(&namebuf[0]), StatPtr(buf), 0); r1, r2, err := Syscall(SYS_STAT, int64(uintptr(unsafe.pointer(&namebuf[0]))), int64(uintptr(unsafe.pointer(buf))), 0);
return r1, err; return r1, err;
} }
export func lstat(name *byte, buf *Stat) (ret int64, errno int64) { export func lstat(name *byte, buf *Stat) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_LSTAT, BytePtr(name), StatPtr(buf), 0); r1, r2, err := Syscall(SYS_LSTAT, int64(uintptr(unsafe.pointer(name))), int64(uintptr(unsafe.pointer(buf))), 0);
return r1, err; return r1, err;
} }
export func fstat(fd int64, buf *Stat) (ret int64, errno int64) { export func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
r1, r2, err := Syscall(SYS_FSTAT, fd, StatPtr(buf), 0); r1, r2, err := Syscall(SYS_FSTAT, fd, int64(uintptr(unsafe.pointer(buf))), 0);
return r1, err; return r1, err;
} }
...@@ -78,7 +81,7 @@ export func unlink(name string) (ret int64, errno int64) { ...@@ -78,7 +81,7 @@ export func unlink(name string) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_UNLINK, BytePtr(&namebuf[0]), 0, 0); r1, r2, err := Syscall(SYS_UNLINK, int64(uintptr(unsafe.pointer(&namebuf[0]))), 0, 0);
return r1, err; return r1, err;
} }
...@@ -92,7 +95,7 @@ export func mkdir(name string, perm int64) (ret int64, errno int64) { ...@@ -92,7 +95,7 @@ export func mkdir(name string, perm int64) (ret int64, errno int64) {
if !StringToBytes(&namebuf, name) { if !StringToBytes(&namebuf, name) {
return -1, ENAMETOOLONG return -1, ENAMETOOLONG
} }
r1, r2, err := Syscall(SYS_MKDIR, BytePtr(&namebuf[0]), perm, 0); r1, r2, err := Syscall(SYS_MKDIR, int64(uintptr(unsafe.pointer(&namebuf[0]))), perm, 0);
return r1, err; return r1, err;
} }
......
...@@ -7,7 +7,10 @@ ...@@ -7,7 +7,10 @@
// DO NOT USE DIRECTLY. // DO NOT USE DIRECTLY.
package syscall package syscall
import "syscall" import (
"syscall";
"unsafe";
)
export func SockaddrToSockaddrInet4(s *Sockaddr) *SockaddrInet4; export func SockaddrToSockaddrInet4(s *Sockaddr) *SockaddrInet4;
export func SockaddrToSockaddrInet6(s *Sockaddr) *SockaddrInet6; export func SockaddrToSockaddrInet6(s *Sockaddr) *SockaddrInet6;
...@@ -20,12 +23,12 @@ export func socket(domain, proto, typ int64) (ret int64, err int64) { ...@@ -20,12 +23,12 @@ export func socket(domain, proto, typ int64) (ret int64, err int64) {
} }
export func connect(fd int64, sa *Sockaddr) (ret int64, err int64) { export func connect(fd int64, sa *Sockaddr) (ret int64, err int64) {
r1, r2, e := Syscall(SYS_CONNECT, fd, SockaddrPtr(sa), int64(sa.len)); r1, r2, e := Syscall(SYS_CONNECT, fd, int64(uintptr(unsafe.pointer(sa))), int64(sa.len));
return r1, e return r1, e
} }
export func bind(fd int64, sa *Sockaddr) (ret int64, err int64) { export func bind(fd int64, sa *Sockaddr) (ret int64, err int64) {
r1, r2, e := Syscall(SYS_BIND, fd, SockaddrPtr(sa), int64(sa.len)); r1, r2, e := Syscall(SYS_BIND, fd, int64(uintptr(unsafe.pointer(sa))), int64(sa.len));
return r1, e return r1, e
} }
...@@ -36,7 +39,7 @@ export func listen(fd, n int64) (ret int64, err int64) { ...@@ -36,7 +39,7 @@ export func listen(fd, n int64) (ret int64, err int64) {
export func accept(fd int64, sa *Sockaddr) (ret int64, err int64) { export func accept(fd int64, sa *Sockaddr) (ret int64, err int64) {
var n int32 = SizeofSockaddr; var n int32 = SizeofSockaddr;
r1, r2, e := Syscall(SYS_ACCEPT, fd, SockaddrPtr(sa), Int32Ptr(&n)); r1, r2, e := Syscall(SYS_ACCEPT, fd, int64(uintptr(unsafe.pointer(sa))), int64(uintptr(unsafe.pointer(&n))));
return r1, e return r1, e
} }
...@@ -50,7 +53,7 @@ export func setsockopt(fd, level, opt, valueptr, length int64) (ret int64, err i ...@@ -50,7 +53,7 @@ export func setsockopt(fd, level, opt, valueptr, length int64) (ret int64, err i
export func setsockopt_int(fd, level, opt int64, value int) int64 { export func setsockopt_int(fd, level, opt int64, value int) int64 {
var n int32 = int32(opt); var n int32 = int32(opt);
r1, e := setsockopt(fd, level, opt, Int32Ptr(&n), 4); r1, e := setsockopt(fd, level, opt, int64(uintptr(unsafe.pointer(&n))), 4);
return e return e
} }
...@@ -59,7 +62,7 @@ export func setsockopt_tv(fd, level, opt, nsec int64) int64 { ...@@ -59,7 +62,7 @@ export func setsockopt_tv(fd, level, opt, nsec int64) int64 {
nsec += 999; nsec += 999;
tv.sec = int64(nsec/1000000000); tv.sec = int64(nsec/1000000000);
tv.usec = uint32(nsec%1000000000); tv.usec = uint32(nsec%1000000000);
r1, e := setsockopt(fd, level, opt, TimevalPtr(&tv), 4); r1, e := setsockopt(fd, level, opt, int64(uintptr(unsafe.pointer(&tv))), 4);
return e return e
} }
...@@ -72,7 +75,7 @@ export func setsockopt_linger(fd, level, opt int64, sec int) int64 { ...@@ -72,7 +75,7 @@ export func setsockopt_linger(fd, level, opt int64, sec int) int64 {
l.yes = 0; l.yes = 0;
l.sec = 0; l.sec = 0;
} }
r1, err := setsockopt(fd, level, opt, LingerPtr(&l), 8); r1, err := setsockopt(fd, level, opt, int64(uintptr(unsafe.pointer(&l))), 8);
return err return err
} }
...@@ -95,15 +98,15 @@ export func kevent(kq int64, changes, events *[]Kevent, timeout *Timespec) (ret ...@@ -95,15 +98,15 @@ export func kevent(kq int64, changes, events *[]Kevent, timeout *Timespec) (ret
nevent = 0; nevent = 0;
eventptr = 0; eventptr = 0;
if changes != nil && len(changes) > 0 { if changes != nil && len(changes) > 0 {
changeptr = KeventPtr(&changes[0]); changeptr = int64(uintptr(unsafe.pointer(&changes[0])));
nchange = int64(len(changes)) nchange = int64(len(changes))
} }
if events != nil && len(events) > 0 { if events != nil && len(events) > 0 {
eventptr = KeventPtr(&events[0]); eventptr = int64(uintptr(unsafe.pointer(&events[0])));
nevent = int64(len(events)) nevent = int64(len(events))
} }
r1, r2, err := Syscall6(SYS_KEVENT, kq, changeptr, nchange, r1, r2, err := Syscall6(SYS_KEVENT, kq, changeptr, nchange,
eventptr, nevent, TimespecPtr(timeout)); eventptr, nevent, int64(uintptr(unsafe.pointer(timeout))));
return r1, err return r1, err
} }
...@@ -7,7 +7,10 @@ ...@@ -7,7 +7,10 @@
// DO NOT USE DIRECTLY. // DO NOT USE DIRECTLY.
package syscall package syscall
import "syscall" import (
"syscall";
"unsafe";
)
export func SockaddrToSockaddrInet4(s *Sockaddr) *SockaddrInet4; export func SockaddrToSockaddrInet4(s *Sockaddr) *SockaddrInet4;
export func SockaddrToSockaddrInet6(s *Sockaddr) *SockaddrInet6; export func SockaddrToSockaddrInet6(s *Sockaddr) *SockaddrInet6;
...@@ -32,12 +35,12 @@ export func socket(domain, proto, typ int64) (ret int64, err int64) { ...@@ -32,12 +35,12 @@ export func socket(domain, proto, typ int64) (ret int64, err int64) {
} }
export func connect(fd int64, sa *Sockaddr) (ret int64, err int64) { export func connect(fd int64, sa *Sockaddr) (ret int64, err int64) {
r1, r2, e := Syscall(SYS_CONNECT, fd, SockaddrPtr(sa), Len(sa)); r1, r2, e := Syscall(SYS_CONNECT, fd, int64(uintptr(unsafe.pointer(sa))), Len(sa));
return r1, e return r1, e
} }
export func bind(fd int64, sa *Sockaddr) (ret int64, err int64) { export func bind(fd int64, sa *Sockaddr) (ret int64, err int64) {
r1, r2, e := Syscall(SYS_BIND, fd, SockaddrPtr(sa), Len(sa)); r1, r2, e := Syscall(SYS_BIND, fd, int64(uintptr(unsafe.pointer(sa))), Len(sa));
return r1, e return r1, e
} }
...@@ -48,7 +51,7 @@ export func listen(fd, n int64) (ret int64, err int64) { ...@@ -48,7 +51,7 @@ export func listen(fd, n int64) (ret int64, err int64) {
export func accept(fd int64, sa *Sockaddr) (ret int64, err int64) { export func accept(fd int64, sa *Sockaddr) (ret int64, err int64) {
var n int32 = SizeofSockaddr; var n int32 = SizeofSockaddr;
r1, r2, e := Syscall(SYS_ACCEPT, fd, SockaddrPtr(sa), Int32Ptr(&n)); r1, r2, e := Syscall(SYS_ACCEPT, fd, int64(uintptr(unsafe.pointer(sa))), int64(uintptr(unsafe.pointer(&n))));
return r1, e return r1, e
} }
...@@ -62,7 +65,7 @@ export func setsockopt(fd, level, opt, valueptr, length int64) (ret int64, err i ...@@ -62,7 +65,7 @@ export func setsockopt(fd, level, opt, valueptr, length int64) (ret int64, err i
export func setsockopt_int(fd, level, opt int64, value int) int64 { export func setsockopt_int(fd, level, opt int64, value int) int64 {
n := int32(opt); n := int32(opt);
r1, e := setsockopt(fd, level, opt, Int32Ptr(&n), 4); r1, e := setsockopt(fd, level, opt, int64(uintptr(unsafe.pointer(&n))), 4);
return e return e
} }
...@@ -71,7 +74,7 @@ export func setsockopt_tv(fd, level, opt, nsec int64) int64 { ...@@ -71,7 +74,7 @@ export func setsockopt_tv(fd, level, opt, nsec int64) int64 {
nsec += 999; nsec += 999;
tv.sec = int64(nsec/1000000000); tv.sec = int64(nsec/1000000000);
tv.usec = uint64(nsec%1000000000); tv.usec = uint64(nsec%1000000000);
r1, e := setsockopt(fd, level, opt, TimevalPtr(&tv), 4); r1, e := setsockopt(fd, level, opt, int64(uintptr(unsafe.pointer(&tv))), 4);
return e return e
} }
...@@ -84,7 +87,7 @@ export func setsockopt_linger(fd, level, opt int64, sec int) int64 { ...@@ -84,7 +87,7 @@ export func setsockopt_linger(fd, level, opt int64, sec int) int64 {
l.yes = 0; l.yes = 0;
l.sec = 0 l.sec = 0
} }
r1, err := setsockopt(fd, level, opt, LingerPtr(&l), 8); r1, err := setsockopt(fd, level, opt, int64(uintptr(unsafe.pointer(&l))), 8);
return err return err
} }
...@@ -101,7 +104,7 @@ export func epoll_create(size int64) (ret int64, errno int64) { ...@@ -101,7 +104,7 @@ export func epoll_create(size int64) (ret int64, errno int64) {
} }
export func epoll_ctl(epfd, op, fd int64, ev *EpollEvent) int64 { export func epoll_ctl(epfd, op, fd int64, ev *EpollEvent) int64 {
r1, r2, err := syscall.Syscall6(SYS_EPOLL_CTL, epfd, op, fd, EpollEventPtr(ev), 0, 0); r1, r2, err := syscall.Syscall6(SYS_EPOLL_CTL, epfd, op, fd, int64(uintptr(unsafe.pointer(ev))), 0, 0);
return err return err
} }
...@@ -109,7 +112,7 @@ export func epoll_wait(epfd int64, ev *[]EpollEvent, msec int64) (ret int64, err ...@@ -109,7 +112,7 @@ export func epoll_wait(epfd int64, ev *[]EpollEvent, msec int64) (ret int64, err
var evptr, nev int64; var evptr, nev int64;
if ev != nil && len(ev) > 0 { if ev != nil && len(ev) > 0 {
nev = int64(len(ev)); nev = int64(len(ev));
evptr = EpollEventPtr(&ev[0]) evptr = int64(uintptr(unsafe.pointer(&ev[0])))
} }
r1, r2, err1 := syscall.Syscall6(SYS_EPOLL_WAIT, epfd, evptr, nev, msec, 0, 0); r1, r2, err1 := syscall.Syscall6(SYS_EPOLL_WAIT, epfd, evptr, nev, msec, 0, 0);
return r1, err1 return r1, err1
......
...@@ -12,11 +12,6 @@ export func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); ...@@ -12,11 +12,6 @@ export func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
export func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64); export func Syscall6(trap int64, a1, a2, a3, a4, a5, a6 int64) (r1, r2, err int64);
export func RawSyscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); export func RawSyscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
export func BytePtr(b *byte) int64;
export func Int32Ptr(p *int32) int64;
export func Int64Ptr(p *int64) int64;
export func BytePtrPtr(b **byte) int64;
/* /*
* Used to convert file names to byte arrays for passing to kernel, * Used to convert file names to byte arrays for passing to kernel,
* but useful elsewhere too. * but useful elsewhere too.
......
...@@ -4,11 +4,14 @@ ...@@ -4,11 +4,14 @@
package syscall package syscall
import syscall "syscall" import (
"syscall";
"unsafe";
)
export func gettimeofday() (sec, nsec, errno int64) { export func gettimeofday() (sec, nsec, errno int64) {
var tv Timeval; var tv Timeval;
r1, r2, e := Syscall(SYS_GETTIMEOFDAY, TimevalPtr(&tv), 0, 0); r1, r2, e := Syscall(SYS_GETTIMEOFDAY, int64(uintptr(unsafe.pointer(&tv))), 0, 0);
if e != 0 { if e != 0 {
return 0, 0, e return 0, 0, e
} }
......
...@@ -14,13 +14,11 @@ export type Timespec struct { ...@@ -14,13 +14,11 @@ export type Timespec struct {
sec int64; sec int64;
nsec uint64; nsec uint64;
} }
export func TimespecPtr(t *Timespec) int64;
export type Timeval struct { export type Timeval struct {
sec int64; sec int64;
usec uint32; usec uint32;
} }
export func TimevalPtr(t *Timeval) int64;
// Processes // Processes
...@@ -43,7 +41,6 @@ export type Rusage struct { ...@@ -43,7 +41,6 @@ export type Rusage struct {
nvcsw int64; nvcsw int64;
nivcsw int64; nivcsw int64;
} }
export func RusagePtr(r *Rusage) int64;
// Files // Files
...@@ -91,7 +88,6 @@ export type Stat struct { ...@@ -91,7 +88,6 @@ export type Stat struct {
lspare uint32; lspare uint32;
qspare [2]uint64; qspare [2]uint64;
} }
export func StatPtr(s *Stat) int64;
// Sockets // Sockets
...@@ -163,13 +159,11 @@ export type Sockaddr struct { ...@@ -163,13 +159,11 @@ export type Sockaddr struct {
opaque [126]byte opaque [126]byte
} }
export const SizeofSockaddr = 128 export const SizeofSockaddr = 128
export func SockaddrPtr(s *Sockaddr) int64;
export type Linger struct { export type Linger struct {
yes int32; yes int32;
sec int32; sec int32;
} }
export func LingerPtr(l *Linger) int64;
// Events (kqueue, kevent) // Events (kqueue, kevent)
...@@ -215,5 +209,4 @@ export type Kevent struct { ...@@ -215,5 +209,4 @@ export type Kevent struct {
data int64; data int64;
udata int64; udata int64;
} }
export func KeventPtr(e *Kevent) int64;
...@@ -14,13 +14,11 @@ export type Timespec struct { ...@@ -14,13 +14,11 @@ export type Timespec struct {
sec int64; sec int64;
nsec uint64; nsec uint64;
} }
export func TimespecPtr(t *Timespec) int64;
export type Timeval struct { export type Timeval struct {
sec int64; sec int64;
usec uint64; usec uint64;
} }
export func TimevalPtr(t *Timeval) int64;
// Processes // Processes
...@@ -43,7 +41,6 @@ export type Rusage struct { ...@@ -43,7 +41,6 @@ export type Rusage struct {
nvcsw int64; nvcsw int64;
nivcsw int64; nivcsw int64;
} }
export func RusagePtr(r *Rusage) int64;
// Files // Files
...@@ -87,7 +84,6 @@ export type Stat struct { ...@@ -87,7 +84,6 @@ export type Stat struct {
ctime Timespec; ctime Timespec;
_unused [3]int64 _unused [3]int64
} }
export func StatPtr(s *Stat) int64;
// Sockets // Sockets
...@@ -165,13 +161,11 @@ export type Sockaddr struct { ...@@ -165,13 +161,11 @@ export type Sockaddr struct {
opaque [126]byte opaque [126]byte
} }
export const SizeofSockaddr = 128 export const SizeofSockaddr = 128
export func SockaddrPtr(s *Sockaddr) int64;
export type Linger struct { export type Linger struct {
yes int32; yes int32;
sec int32; sec int32;
} }
export func LingerPtr(l *Linger) int64;
// Events (epoll) // Events (epoll)
...@@ -197,4 +191,3 @@ export type EpollEvent struct { ...@@ -197,4 +191,3 @@ export type EpollEvent struct {
fd int32; fd int32;
pad int32; pad int32;
} }
export func EpollEventPtr(ev *EpollEvent) int64;
...@@ -6,7 +6,8 @@ package time ...@@ -6,7 +6,8 @@ package time
import ( import (
"syscall"; "syscall";
"time" "time";
"unsafe";
) )
// TODO(rsc): This implementation of time.Tick is a // TODO(rsc): This implementation of time.Tick is a
...@@ -30,7 +31,7 @@ func Ticker(ns int64, c *chan int64) { ...@@ -30,7 +31,7 @@ func Ticker(ns int64, c *chan int64) {
when := now; when := now;
for { for {
when += ns; // next alarm when += ns; // next alarm
// if c <- now took too long, skip ahead // if c <- now took too long, skip ahead
if when < now { if when < now {
// one big step // one big step
...@@ -42,7 +43,7 @@ func Ticker(ns int64, c *chan int64) { ...@@ -42,7 +43,7 @@ func Ticker(ns int64, c *chan int64) {
} }
syscall.nstotimeval(when - now, &tv); syscall.nstotimeval(when - now, &tv);
syscall.Syscall6(syscall.SYS_SELECT, 0, 0, 0, 0, syscall.TimevalPtr(&tv), 0); syscall.Syscall6(syscall.SYS_SELECT, 0, 0, 0, 0, int64(uintptr(unsafe.pointer(&tv))), 0);
now = time.Nanoseconds(); now = time.Nanoseconds();
c <- now; c <- now;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment