Imported Upstream version 4.7.2
[platform/upstream/gcc48.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 netbsd 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         if err = syscall.SetNonblock(int(s.pr.Fd()), true); err != nil {
22                 goto Errno
23         }
24         if err = syscall.SetNonblock(int(s.pw.Fd()), true); err != nil {
25                 goto Errno
26         }
27         if s.poll, err = newpollster(); err != nil {
28                 goto Error
29         }
30         if _, err = s.poll.AddFD(int(s.pr.Fd()), 'r', true); err != nil {
31                 s.poll.Close()
32                 goto Error
33         }
34         s.pending = make(map[int]*netFD)
35         go s.Run()
36         return s, nil
37
38 Errno:
39         err = &os.PathError{
40                 Op:   "setnonblock",
41                 Path: s.pr.Name(),
42                 Err:  err,
43         }
44 Error:
45         s.pr.Close()
46         s.pw.Close()
47         return nil, err
48 }