github.com/axw/llgo@v0.0.0-20160805011314-95b5fe4dca20/third_party/gofrontend/libgo/go/net/newpollserver_rtems.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package net 6 7 import ( 8 "os" 9 "syscall" 10 ) 11 12 func selfConnectedTCPSocket() (pr, pw *os.File, err error) { 13 // See ../syscall/exec.go for description of ForkLock. 14 syscall.ForkLock.RLock() 15 sockfd, e := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0) 16 if e != 0 { 17 syscall.ForkLock.RUnlock() 18 return nil, nil, os.Errno(e) 19 } 20 syscall.CloseOnExec(sockfd) 21 syscall.ForkLock.RUnlock() 22 23 // Allow reuse of recently-used addresses. 24 syscall.SetsockoptInt(sockfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) 25 26 var laTCP *TCPAddr 27 var la syscall.Sockaddr 28 if laTCP, err = ResolveTCPAddr("127.0.0.1:0"); err != nil { 29 Error: 30 return nil, nil, err 31 } 32 if la, err = laTCP.sockaddr(syscall.AF_INET); err != nil { 33 goto Error 34 } 35 e = syscall.Bind(sockfd, la) 36 if e != 0 { 37 Errno: 38 syscall.Close(sockfd) 39 return nil, nil, os.Errno(e) 40 } 41 42 laddr, _ := syscall.Getsockname(sockfd) 43 e = syscall.Connect(sockfd, laddr) 44 if e != 0 { 45 goto Errno 46 } 47 48 fd := os.NewFile(sockfd, "wakeupSocket") 49 return fd, fd, nil 50 } 51 52 func newPollServer() (s *pollServer, err error) { 53 s = new(pollServer) 54 s.cr = make(chan *netFD, 1) 55 s.cw = make(chan *netFD, 1) 56 // s.pr and s.pw are indistinguishable. 57 if s.pr, s.pw, err = selfConnectedTCPSocket(); err != nil { 58 return nil, err 59 } 60 var e int 61 if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 { 62 Errno: 63 err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)} 64 Error: 65 s.pr.Close() 66 return nil, err 67 } 68 if s.poll, err = newpollster(); err != nil { 69 goto Error 70 } 71 if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil { 72 s.poll.Close() 73 goto Error 74 } 75 s.pending = make(map[int]*netFD) 76 go s.Run() 77 return s, nil 78 }