OSDN Git Service

libgo: Update to weekly.2011-11-02.
[pf3gnuchains/gcc-fork.git] / libgo / go / net / newpollserver.go
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 // +build darwin freebsd linux openbsd
6
7 package net
8
9 import (
10         "os"
11         "syscall"
12 )
13
14 func newPollServer() (s *pollServer, err error) {
15         s = new(pollServer)
16         s.cr = make(chan *netFD, 1)
17         s.cw = make(chan *netFD, 1)
18         if s.pr, s.pw, err = os.Pipe(); err != nil {
19                 return nil, err
20         }
21         var e int
22         if e = syscall.SetNonblock(s.pr.Fd(), true); e != 0 {
23                 goto Errno
24         }
25         if e = syscall.SetNonblock(s.pw.Fd(), true); e != 0 {
26                 goto Errno
27         }
28         if s.poll, err = newpollster(); err != nil {
29                 goto Error
30         }
31         if _, err = s.poll.AddFD(s.pr.Fd(), 'r', true); err != nil {
32                 s.poll.Close()
33                 goto Error
34         }
35         s.pending = make(map[int]*netFD)
36         go s.Run()
37         return s, nil
38
39 Errno:
40         err = &os.PathError{"setnonblock", s.pr.Name(), os.Errno(e)}
41 Error:
42         s.pr.Close()
43         s.pw.Close()
44         return nil, err
45 }