diff options
| author | Andrew Wilkins <axwalk@gmail.com> | 2016-03-15 05:36:43 +0000 |
|---|---|---|
| committer | Andrew Wilkins <axwalk@gmail.com> | 2016-03-15 05:36:43 +0000 |
| commit | 6436a4abd7a2f3a60b230453295dba199d8a59c3 (patch) | |
| tree | 125aef80fc2cf46c5d1758a8ece1fde14e7b13fd /llgo/third_party/gofrontend/libgo/go/net/fd_unix.go | |
| parent | 36761bf92427846ce40fdd849615732c852e44dd (diff) | |
| download | bcm5719-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.go | 136 |
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 -} |

