Fix "PR c++/92804 ICE trying to use concept as a nested-name-specifier"
[official-gcc.git] / libgo / go / net / newpollserver_rtems.go
blob2add81467b93a3e965bfb1a451b3df078f953a26
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.
5 // +build rtems
7 package net
9 import (
10 "os"
11 "syscall"
14 func selfConnectedTCPSocket() (pr, pw *os.File, err error) {
15 // See ../syscall/exec.go for description of ForkLock.
16 syscall.ForkLock.RLock()
17 sockfd, e := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
18 if e != 0 {
19 syscall.ForkLock.RUnlock()
20 return nil, nil, os.Errno(e)
22 syscall.CloseOnExec(sockfd)
23 syscall.ForkLock.RUnlock()
25 // Allow reuse of recently-used addresses.
26 syscall.SetsockoptInt(sockfd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
28 var laTCP *TCPAddr
29 var la syscall.Sockaddr
30 if laTCP, err = ResolveTCPAddr("127.0.0.1:0"); err != nil {
31 Error:
32 return nil, nil, err
34 if la, err = laTCP.sockaddr(syscall.AF_INET); err != nil {
35 goto Error
37 e = syscall.Bind(sockfd, la)
38 if e != 0 {
39 Errno:
40 syscall.Close(sockfd)
41 return nil, nil, os.Errno(e)
44 laddr, _ := syscall.Getsockname(sockfd)
45 e = syscall.Connect(sockfd, laddr)
46 if e != 0 {
47 goto Errno
50 fd := os.NewFile(sockfd, "wakeupSocket")
51 return fd, fd, nil
54 func newPollServer() (s *pollServer, err error) {
55 s = new(pollServer)
56 s.cr = make(chan *netFD, 1)
57 s.cw = make(chan *netFD, 1)
58 // s.pr and s.pw are indistinguishable.
59 if s.pr, s.pw, err = selfConnectedTCPSocket(); err != nil {
60 return nil, err
62 var e int
63 if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
64 Errno:
65 err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)}
66 Error:
67 s.pr.Close()
68 return nil, err
70 if s.poll, err = newpollster(); err != nil {
71 goto Error
73 if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
74 s.poll.Close()
75 goto Error
77 s.pending = make(map[int]*netFD)
78 go s.Run()
79 return s, nil