1
2
3
4
5 package net
6
7 import (
8 "os"
9 "syscall"
10 )
11
12 func newPollServer() (s *pollServer, err os.Error) {
13 s = new(pollServer)
14 s.cr = make(chan *netFD, 1)
15 s.cw = make(chan *netFD, 1)
16 if s.pr, s.pw, err = os.Pipe(); err != nil {
17 return nil, err
18 }
19 var e int
20 if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
21 goto Errno
22 }
23 if e = syscall.SetNonblock(s.pw.Fd(), true); e != 0 {
24 goto Errno
25 }
26 if s.poll, err = newpollster(); err != nil {
27 goto Error
28 }
29 if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
30 s.poll.Close()
31 goto Error
32 }
33 s.pending = make(map[int]*netFD)
34 go s.Run()
35 return s, nil
36
37 Errno:
38 err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)}
39 Error:
40 s.pr.Close()
41 s.pw.Close()
42 return nil, err
43 }