summaryrefslogtreecommitdiffstats
path: root/llgo/third_party/gofrontend/libgo/go/net/fd_unix.go
diff options
context:
space:
mode:
authorAndrew Wilkins <axwalk@gmail.com>2016-03-15 05:36:43 +0000
committerAndrew Wilkins <axwalk@gmail.com>2016-03-15 05:36:43 +0000
commit6436a4abd7a2f3a60b230453295dba199d8a59c3 (patch)
tree125aef80fc2cf46c5d1758a8ece1fde14e7b13fd /llgo/third_party/gofrontend/libgo/go/net/fd_unix.go
parent36761bf92427846ce40fdd849615732c852e44dd (diff)
downloadbcm5719-llvm-6436a4abd7a2f3a60b230453295dba199d8a59c3.tar.gz
bcm5719-llvm-6436a4abd7a2f3a60b230453295dba199d8a59c3.zip
[llgo] Roll gofrontend forward
Switch gofrontend to using go.googlesource.com, and update to 81eb6a3f425b2158c67ee32c0cc973a72ce9d6be. There are various changes required to update to the go 1.5 runtime: typemap.go is changed to accommodate the change in representation for equal/hash algorithms, and the removal of the zero value/type. CMakeLists.txt is updated to add the build tree to the package search path, so internal packages, which are not installed, are found. various files changes due to removal of __go_new_nopointers; the same change as in D11863, but with NoUnwindAttribute added to the added runtime functions which are called with "callOnly". minor cleanups in ssa.go while investigating issues with unwinding/panic handling. Differential Revisision: http://reviews.llvm.org/D15188 llvm-svn: 263536
Diffstat (limited to 'llgo/third_party/gofrontend/libgo/go/net/fd_unix.go')
-rw-r--r--llgo/third_party/gofrontend/libgo/go/net/fd_unix.go136
1 files changed, 62 insertions, 74 deletions
diff --git a/llgo/third_party/gofrontend/libgo/go/net/fd_unix.go b/llgo/third_party/gofrontend/libgo/go/net/fd_unix.go
index 7a97faeba34..465023fb23d 100644
--- a/llgo/third_party/gofrontend/libgo/go/net/fd_unix.go
+++ b/llgo/third_party/gofrontend/libgo/go/net/fd_unix.go
@@ -72,7 +72,7 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
// Do not need to call fd.writeLock here,
// because fd is not yet accessible to user,
// so no concurrent operations are possible.
- switch err := syscall.Connect(fd.sysfd, ra); err {
+ switch err := connectFunc(fd.sysfd, ra); err {
case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
case nil, syscall.EISCONN:
if !deadline.IsZero() && deadline.Before(time.Now()) {
@@ -87,13 +87,13 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
// already been accepted and closed by the server.
// Treat this as a successful connection--writes to
// the socket will see EOF. For details and a test
- // case in C see http://golang.org/issue/6828.
+ // case in C see https://golang.org/issue/6828.
if runtime.GOOS == "solaris" {
return nil
}
fallthrough
default:
- return err
+ return os.NewSyscallError("connect", err)
}
if err := fd.init(); err != nil {
return err
@@ -114,25 +114,25 @@ func (fd *netFD) connect(la, ra syscall.Sockaddr, deadline time.Time) error {
if err := fd.pd.WaitWrite(); err != nil {
return err
}
- nerr, err := syscall.GetsockoptInt(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR)
+ nerr, err := getsockoptIntFunc(fd.sysfd, syscall.SOL_SOCKET, syscall.SO_ERROR)
if err != nil {
- return err
+ return os.NewSyscallError("getsockopt", err)
}
switch err := syscall.Errno(nerr); err {
case syscall.EINPROGRESS, syscall.EALREADY, syscall.EINTR:
case syscall.Errno(0), syscall.EISCONN:
return nil
default:
- return err
+ return os.NewSyscallError("getsockopt", err)
}
}
}
func (fd *netFD) destroy() {
// Poller may want to unregister fd in readiness notification mechanism,
- // so this must be executed before closesocket.
+ // so this must be executed before closeFunc.
fd.pd.Close()
- closesocket(fd.sysfd)
+ closeFunc(fd.sysfd)
fd.sysfd = -1
runtime.SetFinalizer(fd, nil)
}
@@ -187,9 +187,7 @@ func (fd *netFD) writeUnlock() {
}
func (fd *netFD) Close() error {
- fd.pd.Lock() // needed for both fd.incref(true) and pollDesc.Evict
if !fd.fdmu.IncrefAndClose() {
- fd.pd.Unlock()
return errClosing
}
// Unblock any I/O. Once it all unblocks and returns,
@@ -197,12 +195,8 @@ func (fd *netFD) Close() error {
// the final decref will close fd.sysfd. This should happen
// fairly quickly, since all the I/O is non-blocking, and any
// attempts to block in the pollDesc will return errClosing.
- doWakeup := fd.pd.Evict()
- fd.pd.Unlock()
+ fd.pd.Evict()
fd.decref()
- if doWakeup {
- fd.pd.Wakeup()
- }
return nil
}
@@ -211,11 +205,7 @@ func (fd *netFD) shutdown(how int) error {
return err
}
defer fd.decref()
- err := syscall.Shutdown(fd.sysfd, how)
- if err != nil {
- return &OpError{"shutdown", fd.net, fd.laddr, err}
- }
- return nil
+ return os.NewSyscallError("shutdown", syscall.Shutdown(fd.sysfd, how))
}
func (fd *netFD) closeRead() error {
@@ -232,10 +222,10 @@ func (fd *netFD) Read(p []byte) (n int, err error) {
}
defer fd.readUnlock()
if err := fd.pd.PrepareRead(); err != nil {
- return 0, &OpError{"read", fd.net, fd.raddr, err}
+ return 0, err
}
for {
- n, err = syscall.Read(int(fd.sysfd), p)
+ n, err = syscall.Read(fd.sysfd, p)
if err != nil {
n = 0
if err == syscall.EAGAIN {
@@ -244,11 +234,11 @@ func (fd *netFD) Read(p []byte) (n int, err error) {
}
}
}
- err = chkReadErr(n, err, fd)
+ err = fd.eofError(n, err)
break
}
- if err != nil && err != io.EOF {
- err = &OpError{"read", fd.net, fd.raddr, err}
+ if _, ok := err.(syscall.Errno); ok {
+ err = os.NewSyscallError("read", err)
}
return
}
@@ -259,7 +249,7 @@ func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
}
defer fd.readUnlock()
if err := fd.pd.PrepareRead(); err != nil {
- return 0, nil, &OpError{"read", fd.net, fd.laddr, err}
+ return 0, nil, err
}
for {
n, sa, err = syscall.Recvfrom(fd.sysfd, p, 0)
@@ -271,11 +261,11 @@ func (fd *netFD) readFrom(p []byte) (n int, sa syscall.Sockaddr, err error) {
}
}
}
- err = chkReadErr(n, err, fd)
+ err = fd.eofError(n, err)
break
}
- if err != nil && err != io.EOF {
- err = &OpError{"read", fd.net, fd.laddr, err}
+ if _, ok := err.(syscall.Errno); ok {
+ err = os.NewSyscallError("recvfrom", err)
}
return
}
@@ -286,7 +276,7 @@ func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
}
defer fd.readUnlock()
if err := fd.pd.PrepareRead(); err != nil {
- return 0, 0, 0, nil, &OpError{"read", fd.net, fd.laddr, err}
+ return 0, 0, 0, nil, err
}
for {
n, oobn, flags, sa, err = syscall.Recvmsg(fd.sysfd, p, oob, 0)
@@ -298,33 +288,26 @@ func (fd *netFD) readMsg(p []byte, oob []byte) (n, oobn, flags int, sa syscall.S
}
}
}
- err = chkReadErr(n, err, fd)
+ err = fd.eofError(n, err)
break
}
- if err != nil && err != io.EOF {
- err = &OpError{"read", fd.net, fd.laddr, err}
+ if _, ok := err.(syscall.Errno); ok {
+ err = os.NewSyscallError("recvmsg", err)
}
return
}
-func chkReadErr(n int, err error, fd *netFD) error {
- if n == 0 && err == nil && fd.sotype != syscall.SOCK_DGRAM && fd.sotype != syscall.SOCK_RAW {
- return io.EOF
- }
- return err
-}
-
func (fd *netFD) Write(p []byte) (nn int, err error) {
if err := fd.writeLock(); err != nil {
return 0, err
}
defer fd.writeUnlock()
if err := fd.pd.PrepareWrite(); err != nil {
- return 0, &OpError{"write", fd.net, fd.raddr, err}
+ return 0, err
}
for {
var n int
- n, err = syscall.Write(int(fd.sysfd), p[nn:])
+ n, err = syscall.Write(fd.sysfd, p[nn:])
if n > 0 {
nn += n
}
@@ -337,7 +320,6 @@ func (fd *netFD) Write(p []byte) (nn int, err error) {
}
}
if err != nil {
- n = 0
break
}
if n == 0 {
@@ -345,8 +327,8 @@ func (fd *netFD) Write(p []byte) (nn int, err error) {
break
}
}
- if err != nil {
- err = &OpError{"write", fd.net, fd.raddr, err}
+ if _, ok := err.(syscall.Errno); ok {
+ err = os.NewSyscallError("write", err)
}
return nn, err
}
@@ -357,7 +339,7 @@ func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
}
defer fd.writeUnlock()
if err := fd.pd.PrepareWrite(); err != nil {
- return 0, &OpError{"write", fd.net, fd.raddr, err}
+ return 0, err
}
for {
err = syscall.Sendto(fd.sysfd, p, 0, sa)
@@ -370,8 +352,9 @@ func (fd *netFD) writeTo(p []byte, sa syscall.Sockaddr) (n int, err error) {
}
if err == nil {
n = len(p)
- } else {
- err = &OpError{"write", fd.net, fd.raddr, err}
+ }
+ if _, ok := err.(syscall.Errno); ok {
+ err = os.NewSyscallError("sendto", err)
}
return
}
@@ -382,7 +365,7 @@ func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oob
}
defer fd.writeUnlock()
if err := fd.pd.PrepareWrite(); err != nil {
- return 0, 0, &OpError{"write", fd.net, fd.raddr, err}
+ return 0, 0, err
}
for {
n, err = syscall.SendmsgN(fd.sysfd, p, oob, sa, 0)
@@ -395,8 +378,9 @@ func (fd *netFD) writeMsg(p []byte, oob []byte, sa syscall.Sockaddr) (n int, oob
}
if err == nil {
oobn = len(oob)
- } else {
- err = &OpError{"write", fd.net, fd.raddr, err}
+ }
+ if _, ok := err.(syscall.Errno); ok {
+ err = os.NewSyscallError("sendmsg", err)
}
return
}
@@ -410,27 +394,34 @@ func (fd *netFD) accept() (netfd *netFD, err error) {
var s int
var rsa syscall.Sockaddr
if err = fd.pd.PrepareRead(); err != nil {
- return nil, &OpError{"accept", fd.net, fd.laddr, err}
+ return nil, err
}
for {
s, rsa, err = accept(fd.sysfd)
if err != nil {
- if err == syscall.EAGAIN {
+ nerr, ok := err.(*os.SyscallError)
+ if !ok {
+ return nil, err
+ }
+ switch nerr.Err {
+ case syscall.EAGAIN:
if err = fd.pd.WaitRead(); err == nil {
continue
}
- } else if err == syscall.ECONNABORTED {
- // This means that a socket on the listen queue was closed
- // before we Accept()ed it; it's a silly error, so try again.
+ case syscall.ECONNABORTED:
+ // This means that a socket on the
+ // listen queue was closed before we
+ // Accept()ed it; it's a silly error,
+ // so try again.
continue
}
- return nil, &OpError{"accept", fd.net, fd.laddr, err}
+ return nil, err
}
break
}
if netfd, err = newFD(s, fd.family, fd.sotype, fd.net); err != nil {
- closesocket(s)
+ closeFunc(s)
return nil, err
}
if err = netfd.init(); err != nil {
@@ -442,13 +433,21 @@ func (fd *netFD) accept() (netfd *netFD, err error) {
return netfd, nil
}
+// Use a helper function to call fcntl. This is defined in C in
+// libgo/runtime.
+//extern __go_fcntl_uintptr
+func fcntl(uintptr, uintptr, uintptr) (uintptr, uintptr)
+
// tryDupCloexec indicates whether F_DUPFD_CLOEXEC should be used.
// If the kernel doesn't support it, this is set to 0.
var tryDupCloexec = int32(1)
func dupCloseOnExec(fd int) (newfd int, err error) {
if atomic.LoadInt32(&tryDupCloexec) == 1 && syscall.F_DUPFD_CLOEXEC != 0 {
- r0, _, e1 := syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), syscall.F_DUPFD_CLOEXEC, 0)
+ syscall.Entersyscall()
+ r0, errno := fcntl(uintptr(fd), syscall.F_DUPFD_CLOEXEC, 0)
+ syscall.Exitsyscall()
+ e1 := syscall.Errno(errno)
if runtime.GOOS == "darwin" && e1 == syscall.EBADF {
// On OS X 10.6 and below (but we only support
// >= 10.6), F_DUPFD_CLOEXEC is unsupported
@@ -470,7 +469,7 @@ func dupCloseOnExec(fd int) (newfd int, err error) {
// from now on.
atomic.StoreInt32(&tryDupCloexec, 0)
default:
- return -1, e1
+ return -1, os.NewSyscallError("fcntl", e1)
}
}
return dupCloseOnExecOld(fd)
@@ -483,7 +482,7 @@ func dupCloseOnExecOld(fd int) (newfd int, err error) {
defer syscall.ForkLock.RUnlock()
newfd, err = syscall.Dup(fd)
if err != nil {
- return -1, err
+ return -1, os.NewSyscallError("dup", err)
}
syscall.CloseOnExec(newfd)
return
@@ -492,7 +491,7 @@ func dupCloseOnExecOld(fd int) (newfd int, err error) {
func (fd *netFD) dup() (f *os.File, err error) {
ns, err := dupCloseOnExec(fd.sysfd)
if err != nil {
- return nil, &OpError{"dup", fd.net, fd.laddr, err}
+ return nil, err
}
// We want blocking mode for the new fd, hence the double negative.
@@ -500,19 +499,8 @@ func (fd *netFD) dup() (f *os.File, err error) {
// I/O will block the thread instead of letting us use the epoll server.
// Everything will still work, just with more threads.
if err = syscall.SetNonblock(ns, false); err != nil {
- return nil, &OpError{"setnonblock", fd.net, fd.laddr, err}
+ return nil, os.NewSyscallError("setnonblock", err)
}
return os.NewFile(uintptr(ns), fd.name()), nil
}
-
-func closesocket(s int) error {
- return syscall.Close(s)
-}
-
-func skipRawSocketTests() (skip bool, skipmsg string, err error) {
- if os.Getuid() != 0 {
- return true, "skipping test; must be root", nil
- }
- return false, "", nil
-}
OpenPOWER on IntegriCloud