src/pkg/net/newpollserver.go - The Go Programming Language

Golang

Source file src/pkg/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	}